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

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

我正在尝试传递参数,并在已经使用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

我尝试过使用下面的
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]