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

时间:2014-02-24 22:48:12

标签: apache .htaccess mod-rewrite url-rewriting

我正在尝试重写以下内容

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

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

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

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

然而,这个RewriteRule似乎没有传递变量。我得到的只是index.php?processurl = / somefile

2 个答案:

答案 0 :(得分:1)

您可以尝试以下规则:

RewriteEngine On
RewriteBase /

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

答案 1 :(得分:1)

问题

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

<小时/>

实施例

鉴于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}

建议

正如anubhava指出你可能想补充一下:

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

这样你就不会意外地重写错误的网址。

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php?processurl=/$1?%{QUERY_STRING}
相关问题