htaccess重定向Angular路由

Luc*_*ney 64 .htaccess redirect routing web-applications angularjs

我有几个路线的角度应用,例如:

site.com/
site.com/page
site.com/page/4
Run Code Online (Sandbox Code Playgroud)

使用angular的html5路由模式,当您从应用程序中单击指向它们的链接时,这些解析正确,但当您进行硬刷新时,当然会出现404错误.为了解决这个问题,我尝试了一个基本的htaccess重写.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]
Run Code Online (Sandbox Code Playgroud)

这适用于角度请求,但是当我尝试在我的域中加载脚本或进行ajax调用时,例如:

<script src="/app/programs/script.js"></script>
Run Code Online (Sandbox Code Playgroud)

这个脚本没有加载 - 它的请求被重定向,它试图加载index.html页面,因为.htaccess认为它应该重新路由请求 - 不知道这个文件确实存在,它应该加载文件而不是重定向.

有没有什么方法可以让htaccess将请求重定向到index.html(带有视图参数),只有当它没有应解析的实际文件时?

raj*_*aur 132

使用如下代码:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.*) /index.html [NC,L]
Run Code Online (Sandbox Code Playgroud)

如果存在,则跳转到实际资源,并且index.html对于所有AngularJS路由,将跳转到实际资源.

  • @rajasaur非常感谢 - 这就是我喜欢stackoverflow的原因.帮助我快速解决了我认为我会整夜想要弄清楚的事情. (2认同)
  • 你把这个 htaccess 文件放在哪里以及如何放? (2认同)

小智 20

应用程序请求的directive模板文件存在问题,但文件丢失.在某些情况下,它导致应用程序请求多个脚本文件index.html.

如果文件不存在,我们应该发送404响应而不是index.html文件.所以我添加简单的正则表达式模式来识别丢失的文件请求.

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
Run Code Online (Sandbox Code Playgroud)


Cit*_*ito 5

一个穷人的解决方案(不使用mod_rewrite):

ErrorDocument 404 /index.html
Run Code Online (Sandbox Code Playgroud)


小智 5

查看此链接:/sf/answers/3461857101/在根文件夹中 创建.htaccess文件并将其粘贴到.htaccess

 <IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)


Sac*_*une 5

就我而言,我创建了如下所示的 .htaccess 文件

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule ^(.*) ./index.html [NC,L]
Run Code Online (Sandbox Code Playgroud)

刚刚添加 。在 /index.html 之前并将该文件添加到我的域中,例如https://example.com/subfolder并且它工作正常