我有一个页面要求用户确认是否要继续或取消,并且我为其使用重写规则:
RewriteRule ^click/(.+)$ aclick.php?url=$1 [B]
当 URL 带有问号时就会出现问题。例如:
http://example.com/click/yahoo.com/mobile/?s=ladygaga
我的目标是将此 URL 重写为:
http://example.com/aclick.php?url=yahoo.com/mobile/%3fs=ladygaga
这样“继续”按钮将继续:“http://yahoo.com/mobile/?s=ladygaga”
但是,继续按钮仅链接到“http://yahoo.com/mobile/”。
有人有办法解决这个问题吗?
最佳答案
使用%{QUERY_STRING}
如下。您必须引用REDIRECT_QUERY_STRING
而不是QUERY_STRING
.
RewriteRule ^click/(.+) aclick.php?url=$1?%{QUERY_STRING} [B,L]
B
flag 会过度转义字符串。如果您访问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_URI
, REDIRECT_URL
, QUERY_STRING
等等
关于apache - 在 mod_rewrite 中处理 '?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13856437/