PHP:在Mod重写的URL上获取变量

时间:2016-02-19 09:53:19

标签: php apache .htaccess mod-rewrite

我试图传递参数并在PHP中使用GET函数对已经使用mod重写重写的URL。

我在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这样的网址,我无法获得任何我怀疑已经重写网址的参数!

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  

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

     

考虑以下规则:

     

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

     

使用[QSA]   flag,/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]

答案 1 :(得分:0)

使用heightHint标记,您应该在QSA规则中使用附加条件交换底部2规则:

search