【问题标题】:Mod_rewrite: Redirect to URL in query string - discard %3f from end of redirected URLMod_rewrite:重定向到查询字符串中的 URL - 从重定向 URL 的末尾丢弃 %3f
【发布时间】:2016-05-12 07:03:55
【问题描述】:

我有一个 .htaccess 重写规则,它接受以下形式的传入请求:

IN 1) http://some.domain.com/path/to/index.htm?url=http://take.me/
IN 2) http://some.domain.com/path/to/index.htm?url=http://take.me/another/path/file.htm?key1=val1&key2+val2

我想要做的是让规则提取 url 键的值并重定向到它的值,ergo:

OUT 1) http://take.me/
OUT 2) http://take.me/another/path/file.htm?key1=val1&key2=val2

以下条件和规则有效:

RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^index\.htm$ %1? [R,L]`

但是在 OUT 2 的情况下,我发现在浏览器地址栏中看到的结果 URL 是:

http://take.me/another/path/file.htm?key1=val1&key2+val2%3f

所以问题是%3f(百分比编码的问号)附加到生成的 URL。该问题是由在 RewriteRule 中使用 ? 引起的,但我需要这样才能丢弃原始查询字符串。我不知道%3f 是否会引起问题,所以为了安全起见,我想消除它。我们使用的是 Apache 2.2.22,所以遗憾的是没有 Query String Discard [QSD] 选项。

有没有办法在保持规则功能的同时消除%3f

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    您可以将此规则与 NE 标志一起使用,这意味着 no escaping 结果 URL:

    RewriteCond %{THE_REQUEST} index\.htm\?url=(\S+) [NC]
    RewriteRule index\.htm$ %1? [L,R=302,NC,NE]
    

    【讨论】:

    • 再次感谢,但是你的规则的结果和我的几乎一样;对于 OUT 2,未转义的 ? 出现在浏览器地址栏的末尾。更改网络浏览器似乎没有帮助。有趣的是,当我使用 Fiddler Web 调试器监控请求时,请求末尾没有 ?(或 %3f)的迹象。
    • 正如您在 Web 调试器中注意到的那样,此规则不应该发生这种情况。不知何故,我认为浏览器正在显示缓存的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2012-05-11
    • 2018-03-15
    • 2012-02-16
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多