【问题标题】:RewriteRule appends unwanted stringRewriteRule 附加不需要的字符串
【发布时间】:2020-04-05 05:34:59
【问题描述】:

我不想责怪 RewriteRule,但在我看来是这样。

最小的例子。在实际代码中,第一个 Rule 做了一些前置,所以它有一些意义,而不是 this。

RewriteRule ^(.*)$ $1

RewriteCond %{REQUEST_URI} ^/pre
RewriteRule ^(.*)$ /post=$1 [R=301,L]

当提交的 URL 是 example.com/pre/sub 时,我收到 301 到 example.com/post=pre/sub/sub。我不知道第二个潜艇是从哪里来的。

我认为这应该起作用的方式。第一条规则$1pre/sub,因此它将pre/sub 重写为pre/sub。 cond 检查 REQUEST_URI 是否以 /pre 开头并防止循环,最后一条规则匹配所有内容,因此 $1pre/sub 并附加它创建 /post=pre/sub,然后将其重定向到该规则。但是浏览器会得到/post=/pre/sub/sub

我做了一些测试:

仅提交example.com/pre 会得到预期的/post=pre

当我将示例修改为

RewriteRule ^(.*)$ -$1-

RewriteCond %{REQUEST_URI} ^/pre
RewriteRule ^(.*)$ /post=&$1& [R=301,L]

结果重定向到/post=&-pre/sub-/sub&,这意味着它被附加在第一条规则“之后”,但在第二条规则“之前”。但是在哪里以及如何?

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite url-routing


    【解决方案1】:

    唷……这让我有些头疼。经过一番挖掘,我决定打开 mod_rewrite 的日志记录。 <my-docroot-path> 是我机器上文档根目录的绝对路径。

    add path info postfix: <my-docroot-path>/pre -> <my-docroot-path>/pre/sub
    strip per-dir prefix: <my-docroot-path>/pre/sub -> pre/sub
    applying pattern '^(.*)$' to uri 'pre/sub'
    rewrite 'pre/sub' -> 'pre/sub'
    add per-dir prefix: pre/sub -> <my-docroot-path>/pre/sub
    add path info postfix: <my-docroot-path>/pre/sub -> <my-docroot-path>/pre/sub/sub
    strip per-dir prefix: <my-docroot-path>/pre/sub/sub -> pre/sub/sub
    applying pattern '^(.*)$' to uri 'pre/sub/sub'
    

    正如您在第 1 行和第 6 行看到的,有一些后缀正在进行。它显然在当前处理的目录上方附加了路径组件。当前处理的目录(.htaccess 的位置)是文档根目录(/),因此它“期望”您处理当前目录级别的条目(/pre)。完成处理后(使用 RewriteRule),它会将嵌套路径组件附加到该结果中。

    这就是为什么当您在同一目录级别处理请求时,它不会产生任何问题,因为没有什么要附加的。

    可以通过在 RewriteRule 指令中添加 DPI 标志来修复(并且官方建议这样做)。 DPI 表示“丢弃路径信息”,它丢弃嵌套的路径组件,这些组件将被后缀,因此不附加任何内容。

    或者...如果您不想更改嵌套路径,只需在替换字符串中包含当前级别的目录/文件名即可。其余的将被添加后缀。这(至少对我而言)有点误导,因为该模式与整个路径匹配,但它希望您仅更改(包括在替换字符串中)当前级别的目录/文件名。但这是有道理的......它为您提供了做出决定的上下文,并希望您只更改 .htaccess 所属的目录级别的部分。

    这是它的官方错误报告。
    https://bz.apache.org/bugzilla/show_bug.cgi?id=38642

    DPI 标志的文档
    https://httpd.apache.org/docs/current/rewrite/flags.html#flag_dpi

    还有其他一些 SO 主题,很有帮助
    https://stackoverflow.com/a/5520004/2468189

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多