我正在尝试重写以下内容
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]