【问题标题】:Detecting double slash (empty parameter) in request_uri在 request_uri 中检测双斜杠(空参数)
【发布时间】:2023-03-13 05:25:02
【问题描述】:

相关 1 2 3

但这个问题略有不同。

假设我有一个类似的 RewriteRule:

RewriteRule ^test/([\w]*)/([\w]*)/([\w]*)/?$ go.php?q=THREE_$1_$2_$3

所以http://localhost/test/a/b/c 被重写为http://localhost/go.php?q=THREE_a_b_c

现在说我想明确捕获中间参数被省略并产生双斜线的条件,例如http://localhost/test/a//c

所以我写了这样一条规则:

RewriteRule ^test/([\w]*)//([\w]*)/?$ go.php?q=TWO_$1_(EMPTY)_$2

BUT ALAS,规则永远不匹配,似乎 RewriteRule 没有看到双斜线,即使双斜线 保留在%{THE_REQUEST}%{REQUEST_URI}

所以我写了这样一条规则:

RewriteCond %{REQUEST_URI} //
RewriteRule ^test/([\w]*)/([\w]*)/?$ go.php?q=TWO_$1_(NONE)_$2

并且 that 有效,因为 RewriteCond 仅适用于 REQUEST_URI 中有双斜杠的情况。但是正如你所看到的,我仍然必须假设在使用正则表达式解析时没有双斜杠。

所有这一切都非常令人不安,因为我认为 RewriteRule 对 %{REQUEST_URI} 有效,但事实证明它没有,它适用于其他东西(双斜杠剥离版本..?)

我的问题是,如果不是原始的 %{REQUEST_URI},那么 RewriteRule 依赖什么?

【问题讨论】:

    标签: apache mod-rewrite double slash


    【解决方案1】:

    对此不确定,但您的第二条规则:

    RewriteRule ^test/([\w]*)//([\w]*)/([\w]*)/?$ go.php?q=TWO_$1_(EMPTY)_$2
    

    似乎正在尝试匹配这样的 URL:

    http://localhost/test/a//b/c
    

    或者像这样:

    http://localhost/test/a///c
    

    如果您将第二条规则更改为:

    RewriteRule ^test/([\w]*)//([\w]*)/?$ go.php?q=TWO_$1_(EMPTY)_$2
    

    它应该可以工作。

    编辑:

    真正的answer

    Apache 删除空路径段

    现在我知道问题不仅仅是一个不正确的正则表达式,我搜索了答案。

    【讨论】:

    • 帖子中的错误。但是 :) 那是你会想的,但实际上并不是这样。
    • 当我写下我所做的只是因为你在你的问题中犯了一个错误时,你投反对票似乎并不公平:/
    • 我知道。但我这样做只是为了防止开车投票。撤消。但这仍然不能真正回答以下问题:如果不是原始的 %{REQUEST_URI} 那么 RewriteRule 依赖于什么?
    • 好吧,从 Gumbo 的回答看来,RewriteRule 以 Apache 自己的内部“规范化”URI 为源,该 URI 发生了一些变化,例如删除了空路径段。
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多