它会陷入无止境的重定向循环。如果在最后一次RewriteRule中,我使用了END而不是L,则它按预期工作。为什么它的行为是这样的,还有其他方法来解决它吗?
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
发布于 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执行,并防止循环行为。
https://stackoverflow.com/questions/61851320
复制相似问题