从 HTACCESS 规则保存 GET 参数


Saving GET parameters from an HTACCESS rule

我的CMS(表达式引擎)需要一些.htaccess规则才能重写在URL中具有index.php的请求。我最近注意到这个正则表达式有点太强了......并且像这样搞砸了 GET 请求:

domain.com/something/?specialurl=http%3A%2F%2Fsamplesite.com%2Findex.php

在这里,index.php在GET参数中,并导致重定向循环。

我需要一个好的策略来允许我的 htaccess 规则继续为我的 CMS 运行,但避免在它们成为查询参数的一部分时搞砸事情。我的正则表达式在下面...任何想法都值得赞赏...以下是我目前的.htaccess规则:

# Redirect index.php Requests
# ------------------------------
RewriteCond %{THE_REQUEST} ^GET.*index'.php [NC]
RewriteRule (.*?)index'.php/*(.*) /$1$2 [R=301,L]
# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteCond $1 !'.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

提前致谢

将条件更改为

RewriteCond %{THE_REQUEST} ^GET[^?]+index'.php [NC]

以上内容适用于您网站上任何位置的所有index.php文件。如果只想重定向特定文件(如 /index.php ),则可以使用:

RewriteCond %{THE_REQUEST} ^GET' /index'.php [NC]

%{THE_REQUEST}包含给定 URI 绝对路径的方法和 HTTP 协议版本旁边的整个请求行 - 但未规范化。

这意味着如果index.php被URL编码为%69ndex.php,您的代码现在已经失败,这是完全可能的。

可悲的消息是,Apache HTTP在这里没有帮助你。最好在 PHP 脚本中检查这些条件,并在那里触发和适当的重定向。我还要说这是正确的地方,因为无论如何您都应该在那里进行 URL 规范化。

我相信你的规则中需要NE(NoEscape)标志。

请尝试以下规则:

# Redirect index.php Requests
# ------------------------------
RewriteCond %{THE_REQUEST} ^GET.*index'.php [NC]
RewriteRule ^(.*?)index'.php/*(.*)$ /$1$2 [R=301,L,NC,NE]
# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteCond $1 !'.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L,NE]

PS:如果您已经从某个地方收到编码请求,则此标志将无济于事。