Angularjs 角度路由的htaccess重定向

Angularjs 角度路由的htaccess重定向,angularjs,.htaccess,redirect,web-applications,routing,Angularjs,.htaccess,Redirect,Web Applications,Routing,我有一个具有多条路线的角度应用程序,例如: site.com/ site.com/page site.com/page/4 <script src="/app/programs/script.js"></script> 使用angular的html5路由模式,当您从应用程序中单击指向它们的链接时,这些问题可以正确解决,但当您进行硬刷新时,当然是404错误。为了解决这个问题,我尝试了实现一个基本的htaccess重写 RewriteEngine On RewriteCo

我有一个具有多条路线的角度应用程序,例如:

site.com/
site.com/page
site.com/page/4
<script src="/app/programs/script.js"></script>
使用angular的html5路由模式,当您从应用程序中单击指向它们的链接时,这些问题可以正确解决,但当您进行硬刷新时,当然是404错误。为了解决这个问题,我尝试了实现一个基本的htaccess重写

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_METHOD} !OPTIONS
RewriteRule ^(.*)$ index.html [L]
这适用于angular请求,但是当我尝试在我的域内加载脚本或进行ajax调用时,例如:

site.com/
site.com/page
site.com/page/4
<script src="/app/programs/script.js"></script>

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

只有在没有实际文件需要解析时,我才可以让htaccess将请求重定向到index.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]

这将跳到实际资源(如果有),并跳到所有AngularJS路线的
index.html

如果应用程序请求
指令
模板文件,但缺少文件,则会出现问题。在某些情况下,它会导致应用程序在
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
穷人的解决方案(不使用mod_rewrite):


如果您需要,我将提供另一个详细的htaccess文件:

  • 请考虑baseUrl和默认索引文件
  • 删除要管理的前导斜杠:params
这是我的htaccess,非常接近,但更具体:

DirectoryIndex index.html
RewriteEngine on
RewriteBase /subDir
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*) index.html [NC,L]
查看此链接: 在根文件夹中创建
.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>

重新启动发动机
重写基/
重写规则^index\.html$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/index.html[L]

在我的例子中,我创建了.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]

刚刚添加。在/index.html之前,将该文件添加到我的域中,就像它工作正常一样

在我的情况下,我们需要一个更具功能的reach
.htaccess
配置,比如:

  • 强制使用HTTPS协议(在下面注释掉)
  • Authorization
    标题转换为
    HTTP\u Authorization
    环境变量
  • 跨源资源共享(CORS)
  • 并禁用特定格式的缓存(也被注释掉)

#如果mod_重写不存在。
FallbackResource/index.html
重新启动发动机
#所有重写路由的前缀(“index.html”获取“/index.html”)。
重写基/
#重定向到HTTPS协议(一旦未注释)。
#
#重写cond%{HTTPS}!在…上
#重写规则(.*)https://%{HTTP_HOST}%{REQUEST_URI}[L]
#确保授权HTTP头可用。
重写规则^-[E=HTTP\U授权:%{HTTP:AUTHORIZATION}]
#允许访问现有文件或目录。
RewriteCond%{REQUEST_FILENAME}-s[或]
RewriteCond%{REQUEST_FILENAME}-l[或]
RewriteCond%{REQUEST_FILENAME}-d
重写规则^.*$-[NC,L]
#防止将主脚本视为路由。
重写规则^index\.html$-[L]
#将其他内容重定向到主脚本
重写规则^(.*)index.html[NC,L]
#启用跨源资源共享(CORS)
#
标题合并不同来源
#允许任何来源(与“*”类似,但适用于更多情况)
setenif Origin“^(http(s)?:/[^/:]*(?::\d{1,5})?”请求\u Origin=$1
标头始终附加访问控制允许原点%{REQUEST\u Origin}e env=REQUEST\u Origin
标头始终将访问控制允许凭据设置为“true”
标题始终设置访问控制允许方法“获取、发布、放置、删除”
标头始终设置访问控制允许标头“*”
标头始终设置访问控制公开标头“*”
#为生产禁用浏览器缓存(根据需要编辑模式)。
#
#
#   
#FileTag无
#标题未设置ETag
#标题未设置Pragma
#头取消缓存控制
#上次修改未设置的标题
#标题集Pragma“无缓存”
#标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
#标题集过期“1972年4月10日星期一00:00:00 GMT”
#   
#
注意:我们使用
[L]
而不是
[L,R=301]
,因为后者会导致浏览器永久缓存重定向
(即使有一天该路由是一个文件,它仍然会被重定向)。

是一个有效的文件吗?是的,如果没有我当前的.htaccess(如问题中所述),该文件可以正确解析。这个技巧也适用于Angular 2。这几乎是完美的-它似乎不使用参数处理路由,例如site.com/page/4,虽然我不知道为什么。结果证明这很好-我只是有一些没有前导斜杠(/)的文件引用,所以我们尝试在带有参数的路由中相对解析。@rajasaur非常感谢-这就是我喜欢stackoverflow的原因。帮助我快速解决了我认为我会彻夜未眠的问题。你把这个htaccess文件放在哪里,怎么放?嗨,就我而言,我有
http://www.domain.com/dashboard
。所以url有
/dashboard
,那么只有我想打开angular项目。请帮助我如何为相同的文件编写
.htaccess
。实际上我有两个不同的角度项目。第一个将在
http://www.domain.com
和第二个应在
http://www.domain.com/dashboard
。如果文件不存在,而执行
RewriteRule^-[L,R=404]
我可以使用
RewriteRule^/index.html
RewriteRule^-[L,R=/index.html]重定向到index.html吗?我在appserver环境中,路径经常中断。不习惯.htaccess中的此类更改,但只想重定向