.htaccess异常重定向行为

.htaccess异常重定向行为,.htaccess,.htaccess,我有以下.htaccess(域名已更改,文件已缩短): 当我访问时,我会被正确地重定向到。但当我访问时,我被重定向到 看起来第一条规则是干扰其他规则,我不知道为什么,谷歌说这应该正常工作 如果我将.htaccess重写为: RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=302,L] RewriteRule ^(|/)$ https://www

我有以下.htaccess(域名已更改,文件已缩短):

当我访问时,我会被正确地重定向到。但当我访问时,我被重定向到

看起来第一条规则是干扰其他规则,我不知道为什么,谷歌说这应该正常工作

如果我将.htaccess重写为:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=302,L]

RewriteRule ^(|/)$ https://www.destination.com/software/pwa [R=302,L]
RewriteRule ^cases(|/)$ https://www.destination.com/cases [R=302,L]
两个重定向都工作正常。为什么第一个.htaccess不能按预期工作

如注释中所述,mod_alias
Redirect
指令使用简单的前缀匹配,匹配后的所有内容都附加到目标URL的末尾。因此,上面的第一个重定向匹配所有内容,并且在初始斜杠附加到目标URL的末尾之后匹配所有内容-这就是您看到的内容

要解决此问题,您可以对
重定向
指令重新排序,以便最具体的指令排在第一位

或者,您可以使用mod_别名
RedirectMatch
,而不是简单的前缀匹配,该别名与正则表达式匹配(如mod_rewrite
RewriteRule

例如:

RedirectMatch 302 ^/$ https://www.destination.com/software/pwa
RedirectMatch 302 ^/cases$ https://www.destination.com/cases
RedirectMatch 302 ^/cases/digitaal-meldpunt-voor$ https://www.destination.com/cases/ontwikkeling
它仅与URL
/
/cases
/cases/digital meldput voor
精确匹配


请注意,在
重写规则
(mod_rewrite)指令中,您还允许使用可选的尾部斜杠?
Redirect
指令还允许使用可选的尾部斜杠,因为它们是前缀匹配的


Redirect
指令的前缀匹配特性允许您轻松地将所有内容从一个域批量重定向到另一个域,同时维护URL路径:

Redirect / https://newdomain.example/
如注释中所述,mod_alias
Redirect
指令使用简单的前缀匹配,匹配后的所有内容都附加到目标URL的末尾。因此,上面的第一个重定向匹配所有内容,并且在初始斜杠附加到目标URL的末尾之后匹配所有内容-这就是您看到的内容

要解决此问题,您可以对
重定向
指令重新排序,以便最具体的指令排在第一位

或者,您可以使用mod_别名
RedirectMatch
,而不是简单的前缀匹配,该别名与正则表达式匹配(如mod_rewrite
RewriteRule

例如:

RedirectMatch 302 ^/$ https://www.destination.com/software/pwa
RedirectMatch 302 ^/cases$ https://www.destination.com/cases
RedirectMatch 302 ^/cases/digitaal-meldpunt-voor$ https://www.destination.com/cases/ontwikkeling
它仅与URL
/
/cases
/cases/digital meldput voor
精确匹配


请注意,在
重写规则
(mod_rewrite)指令中,您还允许使用可选的尾部斜杠?
Redirect
指令还允许使用可选的尾部斜杠,因为它们是前缀匹配的


Redirect
指令的前缀匹配特性允许您轻松地将所有内容从一个域批量重定向到另一个域,同时维护URL路径:

Redirect / https://newdomain.example/

Redirect
指令根据路径进行前缀匹配,并将多余的内容追加到目标URL。文档清楚地解释了这一点……从我在线阅读的内容来看,
重定向是基于完全匹配的重定向,这意味着如果存在路由/案例,它将与之匹配,而不是其他任何内容。。。但你的评论确实给了我一个提示,我颠倒了重定向的顺序,现在它们正在按预期工作。不知道你读了什么,在哪里,但明确地说:“[…]任何以URL路径开头的请求都将向目标URL位置的客户端返回重定向请求。匹配URL路径之外的其他路径信息将附加到目标URL。“在这种情况下,这意味着,即使您将重定向放在最后一个
/
,这仍然会将对
/foobar
的请求重定向到
https://www.destination.com/software/pwafoobar
now.
Redirect
指令根据路径进行前缀匹配,并将多余的内容追加到目标URL。文档清楚地解释了这一点……从我在线阅读的内容来看,
重定向是基于完全匹配的重定向,这意味着如果存在路由/案例,它将与之匹配,而不是其他任何内容。。。但你的评论确实给了我一个提示,我颠倒了重定向的顺序,现在它们正在按预期工作。不知道你读了什么,在哪里,但明确地说:“[…]任何以URL路径开头的请求都将向目标URL位置的客户端返回重定向请求。匹配URL路径之外的其他路径信息将附加到目标URL。“在这种情况下,这意味着,即使您将重定向放在最后一个
/
,这仍然会将对
/foobar
的请求重定向到
https://www.destination.com/software/pwafoobar
现在。我会接受你的回答,因为这是最有用的,而且我实际上按照你的建议做了,重新安排
重定向
规则,以便/规则是最后一个。它正在按预期工作。我没有选择
RewriteRule
RewriteMatch
,因为我实现了我想要的,而且它也可以使用后面的斜杠。我会接受你的答案,因为它是最有用的,而且我确实按照你的建议做了,重新安排
重定向
规则,以便/rule是最后一个。它正在按预期工作。我没有选择
RewriteRule
RewriteMatch
,因为我实现了我想要的,而且它也适用于后面的斜杠。