PHP:在Mod重写的URL上获取变量
我正在尝试传递参数,并在已经使用mod rewrite重写的URL上使用PHP中的PHP:在Mod重写的URL上获取变量,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我正在尝试传递参数,并在已经使用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 R
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
我尝试过使用下面的QSA
标志,但仍然无法使其正常工作
RewriteRule ^search/?$ ?action=search [L,QSA]
您需要更新重写规则以使用(查询字符串附加)标志(规则中不包含
?
字符):
QSA
标志告诉Apache保留附加到URL的任何内容:
当替换URI包含查询字符串时,默认行为
重写规则的作用是丢弃现有的查询字符串,并替换它
使用新生成的一个。使用[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
rule中用附加条件交换底部的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]
因此,一旦我使用了QSA
标志,我就不需要重写规则中的?
(^search/?$
),这是正确的。重写规则应在不带?
字符的情况下添加。我在OT中有一个关于此重写规则的更新问题,如果您有一两分钟的时间提供任何建议,请。@LLANTO恐怕您不能忽略查询参数。你需要用另一种方式来处理这件事。不是我,我时不时地看到,有些人似乎不明白这是怎么回事。
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]