使用重写规则通过 htaccess 传递变量



我正在尝试重写以下内容

http://example.com/somefile?variable=somevariable

index.php?processurl=/somefile?variable=somevariable

我知道我需要使用 [QSA] 来传递变量,所以我在我的 htaccess 中写了以下内容:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*) index.php?processurl=/$1 [QSA]

但是,此重写规则似乎没有传递变量。我得到的只是index.php?processurl=/somefile

问题

问题在于您对QSA标志的理解。这样做的作用是将原始查询字符串附加到重定向的 URL。这在您希望将另一个参数(或多个)附加到查询字符串的某些情况下很有用。


**例**

给定网址:

 http://example.com/?var1=somevalue 

然后重写规则:

 RewriteRule . /?var2=thisvalue
 RewriteRule . /?var2=thisvalue [QSA]

将输出:

 Rule 1 > http://example.com/?var2=thisvalue
 Rule 2 > http://example.com/?var2=thisvalue&var1=somevalue

问题在于,在您的情况下,您不想将查询字符串追加为查询字符串,而是希望将其追加为变量;如果这有意义......

溶液

然后的解决方案是 - 听起来很简单 - 将查询字符串附加为变量......

您可以使用变量 %{QUERY_STRING} 来执行此操作:

 RewriteEngine On
 RewriteBase /
 RewriteRule ^(.*) index.php?processurl=/$1?%{QUERY_STRING}

建议

正如阿努巴瓦指出的那样,你可能想补充:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这样您就不会意外地重写错误的 URL。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php?processurl=/$1?%{QUERY_STRING}

你可以试试这个规则:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?processurl=/$1 [QSA,L]

最新更新