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