【发布时间】: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。我不知道第二个潜艇是从哪里来的。
我认为这应该起作用的方式。第一条规则$1 是pre/sub,因此它将pre/sub 重写为pre/sub。 cond 检查 REQUEST_URI 是否以 /pre 开头并防止循环,最后一条规则匹配所有内容,因此 $1 为 pre/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