我试图传递参数并在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]
答案 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