首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个.htaccess重写代码没有正确地重定向?

问为什么这个.htaccess重写代码没有正确地重定向?
EN

Stack Overflow用户
提问于 2020-05-17 11:51:06
回答 1查看 120关注 0票数 1

它会陷入无止境的重定向循环。如果在最后一次RewriteRule中,我使用了END而不是L,则它按预期工作。为什么它的行为是这样的,还有其他方法来解决它吗?

代码语言:javascript
复制
RewriteEngine on

#remove tailing slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/+$ /$1 [R,L]

#external redirect: /page.php to /page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)\.php$ /$1 [R,L]

#internal redirect: page to page.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*?)$ $1\.php [L]

我的Apache版本是2.4.43

解决办法:

我想我现在明白了到底发生了什么。Mod_rewrite只在一个版本的URI上工作,当我使用R标志时,更改仅在浏览器中可见。这与@anubhava的答案一起导致了无止境的重定向循环。换句话说,我认为RewriteRule ^(.*)\.php$ /$1 [R,L]和RewriteRule ^(.*?)$ $1\.php [L]实际上不能在相同版本的URI上工作。

R标志解释:R

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-17 17:02:34

标志L和END的行为不同。L标志意味着再次轮回重写循环(在while循环中的作用类似于continue ),而END循环终止循环(在while循环中的作用类似于break )。

END标志是在Apache2.4中引入的,它用于防止重写循环,就像您目前正在观察的那样。

当您使用L时,最后一个规则在请求uri的末尾添加.php,当重写循环再次运行时,#external redirect规则从请求uri中删除.php,然后最后一个规则在请求uri的末尾添加.php。此循环继续并导致无限循环。为了防止这种情况,您可以在最后一条规则中使用END标志,该标志仅终止当前请求的mod_rewrite执行,并防止循环行为。

重写规则集处理

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61851320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档