【问题标题】:PHP: GET Variables on Mod Rewritten URLPHP:获取 Mod 重写 URL 上的变量
【发布时间】:2016-02-19 09:53:18
【问题描述】:

我正在尝试在已经使用 mod rewrite 重写的 URL 上传递参数并在 PHP 中使用 GET 函数。

我的 HTACCESS 文件中有这个:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^-]*)/$ ?action=$1 [L]

RewriteRule ^search/$  ?action=search [L]

如果我有一个像 http://www.example.com/search/?q=test 这样的 URL,我无法获得任何我怀疑是因为我已经重写了 URL!?

我已尝试使用如下所示的 QSA 标志,但仍无法使其正常工作。

RewriteRule ^search/?$  ?action=search [L,QSA]

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:

    您需要更新您的 RewriteRules 以使用 QSA(查询字符串附加)标志(规则中没有 ? 字符):

    RewriteRule ^search/$  ?action=search [L,QSA]
    

    QSA 标志告诉 Apache 保留附加到 URL 的任何内容:

    当替换 URI 包含查询字符串时,默认行为 RewriteRule 的就是丢弃已有的查询字符串,并替换它 与新生成的。使用 [QSA] 标志会导致查询 要组合的字符串。

    考虑以下规则:

    RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]

    [QSA] 标志,/pages/123?one=two 的请求将被映射到 /page.php?page=123&one=two。如果没有 [QSA] 标志,同样的请求 将映射到/page.php?page=123——即现有查询 字符串将被丢弃。

    此外,永远不会达到^search/$ 规则,因为它被以下规则覆盖:RewriteRule ^([^-]*)/$ ?action=$1 [L](具有L 标志)。您需要更新整个.htaccess 文件,如下所示:

    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteRule ^search/$  ?action=search [L,QSA]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^-]*)/$ ?action=$1 [L,QSA]
    

    【讨论】:

    • 所以一旦我使用QSA 标志,我就不需要在重写规则中使用? (^search/?$)?
    • @llanato 没错。应添加不带 ? 字符的 RewriteRule。
    • 如果您有一两分钟的时间可以提供任何建议,请在 OT 中对这个重写规则提出更新的问题。
    • @llanato 恐怕您不能忽略查询参数。你需要用另一种方式来处理。
    • 不是我,我时常看到这个,有些人似乎不明白 SO 是如何工作的。
    【解决方案2】:

    使用QSA 标志,您应该用search 规则中的附加条件交换底部2 条规则:

    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    RewriteCond %{QUERY_STRING} (?:^|&)action=search(?:&|$) [NC]
    RewriteRule ^search/?$ ?action=search [L,QSA,NC]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/?$ ?action=$1 [L,QSA]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多