1

我的 CMS(表达式引擎)需要一些.htaccess规则才能重写index.phpurl 中的请求。我最近注意到这个正则表达式有点太强大了......并且正在搞乱这样的 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]

提前致谢

4

3 回答 3

1

将条件更改为

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

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

RewriteCond %{THE_REQUEST} ^GET\ /index\.php [NC]
于 2013-10-26T23:15:05.647 回答
1

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

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

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

于 2013-10-26T23:28:22.730 回答
1

我相信您的规则中需要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:如果您已经从某个地方收到编码请求,则此标志将无济于事。

于 2013-10-27T02:01:15.590 回答