【问题标题】:Saving GET parameters from an HTACCESS rule从 HTACCESS 规则保存 GET 参数
【发布时间】:2013-10-26 23:09:00
【问题描述】:

我的 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]

提前致谢

【问题讨论】:

  • 我认为没有太多理由对 .htaccess 文件进行 URL 规范化,请参阅下面的答案。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

将条件改为

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

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

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

【讨论】:

  • 这似乎有效,尽管我不完全确定为什么;你能描述一下这个想法是什么吗?再次感谢。
  • 第二个条件有效,因为您提供了index.php 的绝对路径。第一个有效,因为它匹配所有位于? 左侧的index.phps,即查询字符串分隔符。在这里,[^?]+ 匹配除 ? 之外的所有字符。
【解决方案2】:

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

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

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

【讨论】:

  • 我非常感谢上下文/答案 - 尽管我不是 100% 确定这如何帮助我将 index.php 的实例与请求的文件与 index.php 的查询参数中的字符串分开
  • 您可以通过在前端控制器(或您在应用程序中使用的任何入口点)中验证请求来执行此操作,然后直接触发重定向到正确的(规范)URI,以防万一它要求的。传入的 PHP 请求很容易在路径内部和查询参数内部有所不同。
【解决方案3】:

我相信您的规则中需要NE (NoEscape) flag

试试这些规则:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多