apache - 在 mod_rewrite 中处理 '?'

标签 apache mod-rewrite

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

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/

相关文章:

.htaccess - SEO 的子域和 htaccess 问题

django - 如何在 Web 服务器上设置 PYTHONPATH

apache - 如何根据用户角色将 geoserver WFS 服务配置为仅访问某些图层?

apache - 如何使用.htaccess删除部分URl?

php - .htaccess 如果文件存在则重定向

php - 通过 PHP 或 Apache 从服务器端上传 HTTP 文件

apache - .htaccess RewriteRule 国家/地区代码和 url

javascript - 代理错误502,在apache2服务器上运行node js应用程序

apache - 如何为同一域但不同的上下文路径设置 2 个不同的 Web/应用程序服务器?

.htaccess - 收到错误 "Invalid command ' SSLProxyCheckPeerCN'