【问题标题】:Can mod_rewrite preserve a double slash?mod_rewrite 可以保留双斜杠吗?
【发布时间】:2010-10-27 17:28:46
【问题描述】:

我只是在学习 mod_rewrite 和 regex 的东西,而我正在尝试做的是将任意名称的变量、任意数量的变量和值传递到脚本中,并将它们转发到不同的脚本。

这是我目前所拥有的:

RewriteEngine on
RewriteRule ^script\$(.*[\])? anotherscript?ip=%{REMOTE_ADDR}&$1 [L] 

除了我传递的参数之一是 URL 和 http:// 之后的 // 总是被剥离成一个斜杠之外,这一切似乎都有效。

例如,我做

脚本$url=http://www.stackoverflow.com

然后它重定向到:

anotherscript?ip=127.0.0.1&url=http:/www.stackoverflow.com

第二个脚本在单斜杠上阻塞。

我意识到保留双斜杠与人们通常使用 mod_rewrite 所做的完全相反。有什么办法可以保留双斜线吗?

编辑:在 Gumbo 的帮助下找到了解决方案。

RewriteCond %{THE_REQUEST} ^GET\ (.*)/script\$([^\s]+) 
RewriteRule ^script\$(.*) anotherscript?ip=%{REMOTE_ADDR}&%2 [L]

我必须在 RewriteCond 上的 /script 前面添加 (.*),一旦我这样做了,它就消除了 404 错误,然后只需传递匹配项即可。

【问题讨论】:

    标签: regex mod-rewrite


    【解决方案1】:

    试试这个规则:

    RewriteCond %{THE_REQUEST} ^GET\ /script\$([^\s]+)
    RewriteRule ^script\$.+ anotherscript?ip=%{REMOTE_ADDR}&%1 [L]
    

    请参阅Diggbar modrewrite- How do they pass URLs through modrewrite? 了解说明。

    【讨论】:

    • 这导致找不到 404
    • 希望你没有忘记必填的RewriteEngine on
    • 它对我有用。您是否已经尝试过用于调试的内部日志记录功能?见httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteloglevel
    • 我已启用日志记录,它只显示“[Thu May 21 12:58:45 2009] [error] [client 127.0.0.1] 文件不存在:C:/(path) " 看起来它试图找到一个名为 "script$id=123" 的文件,而不是解析该部分。
    • 尝试禁用 MutliViews。这可能会导致 Apache 在将请求传递给 mod_rewrite 之前寻找替代方案。
    【解决方案2】:

    我认为你的 RewriteRule 正则表达式的第一部分可能有问题

    ^script\$(.*[\])?
    

    反斜杠 (\) 用于将一个特殊字符转义为一个小字符,因此您实际上是在尝试匹配一个右括号 (]),这是故意的吗?

    试试这个

    RewriteRule ^script\$(.*)? anotherscript?ip=%{REMOTE_ADDR}&$1 [L]
    

    【讨论】:

    • 很好,我删除了那部分,它仍然有效,但双斜杠仍在转换为单斜杠。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2015-03-19
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2015-02-06
    相关资源
    最近更新 更多