处理'?'在mod_rewrite中

时间:2012-12-13 09:10:55

标签: apache mod-rewrite

我有一个页面要求用户确认他是否要继续或取消,我会使用重写规则:

RewriteRule ^click/(.+)$ aclick.php?url=$1 [B]

当URL有问号时,会出现问题。例如:

http://example.com/click/yahoo.com/mobile/?s=ladygaga

我的目标是将此网址重写为:

http://example.com/aclick.php?url=yahoo.com/mobile/%3fs=ladygaga

这样继续按钮将继续:'http://yahoo.com/mobile/?s = ladygaga'

但是,“继续”按钮只链接到“http://yahoo.com/mobile/”。

有没有人有想法解决这个问题?

1 个答案:

答案 0 :(得分:2)

使用%{QUERY_STRING}如下。您必须引用REDIRECT_QUERY_STRING而不是QUERY_STRING

RewriteRule ^click/(.+) aclick.php?url=$1?%{QUERY_STRING} [B,L]

B标志会过度地转义字符串。如果您访问http://example.com/click/yahoo.com/mobile/?s=ladygaga,查询字符串将为url=yahoo%2ecom%2fmobile%2f?s=ladygaga。 (它不会造成不良影响。)

如果该URL没有查询字符串,则多余的“?”被添加到查询字符串的末尾。要防止这种情况发生,请使用RewriteCond

# If URL have any query string, then
RewriteCond %{QUERY_STRING} .
RewriteRule ^click/(.+) aclick.php?url=$1?%{QUERY_STRING} [B,L]
# otherwise,
RewriteRule ^click/(.+) aclick.php?url=$1

您可以简单地写成如下:

RewriteRule ^click/(.+) aclick.php

程序aclick.php可以引用环境变量REQUEST_URIREDIRECT_URLQUERY_STRING等。