htaccess的Angular路线redirect
我有几个路线的angular度应用程序,如:
site.com/ site.com/page site.com/page/4
使用angular的html5路由模式,当你点击应用程序中的链接时,这些方法可以正确parsing,但是当你进行硬刷新的时候,当然是404错误。 为了解决这个问题,我尝试了一个基本的htaccess重写。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_METHOD} !OPTIONS RewriteRule ^(.*)$ index.html [L]
这适用于angular度请求,但是当我尝试加载脚本或在我的域内进行ajax调用时,例如:
<script src="/app/programs/script.js"></script>
这个脚本不加载 – 它的请求被redirect,它试图加载index.html页面,因为.htaccess认为它应该重新路由请求 – 不知道这个文件是否存在,它应该加载文件,而不是redirect。
有什么办法可以让htaccess的请求redirectindex.html(与视图参数)只有当没有一个实际的文件,它应该解决?
使用一个片段,如:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^(.*) /index.html [NC,L]
这将跳到实际的资源,如果有一个,并index.html所有angularjs路由。
如果应用程序请求directive
模板文件,但文件丢失 ,则会出现问题。 在某些情况下,它会导致应用程序在index.html
请求多个脚本文件。
如果文件不存在,我们应该发送404
响应而不是index.html
文件。 所以我添加简单的正则expression式模式来识别丢失的文件请求。
RewriteEngine On # If an existing asset or directory is requested go to it as it is RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d RewriteRule ^ - [L] # If the requested pattern is file and file doesn't exist, send 404 RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$ RewriteRule ^ - [L,R=404] # otherwise use history router RewriteRule ^ /index.html
一个穷人的解决scheme(不使用mod_rewrite):
ErrorDocument 404 /index.html