Regex 重写规则附加不需要的字符串

Regex 重写规则附加不需要的字符串,regex,apache,.htaccess,mod-rewrite,url-routing,Regex,Apache,.htaccess,Mod Rewrite,Url Routing,我不想责怪你,但在我看来是这样的 最低限度的例子。在实际代码中,第一条规则做了一些前置,因此它有一些意义,与此相反 RewriteRule ^(.*)$ $1 RewriteCond %{REQUEST_URI} ^/pre RewriteRule ^(.*)$ /post=$1 [R=301,L] 当提交的URL是example.com/pre/sub时,我将获得301到example.com/post=pre/sub/sub。我不知道第二艘潜艇是从哪里来的 我认为应该这样做。第一条规则$

我不想责怪你,但在我看来是这样的

最低限度的例子。在实际代码中,第一条规则做了一些前置,因此它有一些意义,与此相反

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检查请求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&
,这意味着它附加在第一条规则之后,但附加在第二条规则之前。但是在哪里以及如何去做呢?

Pheeew。。。这让我有些头痛。经过一番深入研究,我决定打开mod_rewrite的日志记录<代码>是我机器上文档根目录的绝对路径

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'
添加路径信息后缀:/pre->/pre/sub
每个目录的条带前缀:/pre/sub->pre/sub
将模式“^(.*)$”应用于uri“pre/sub”
重写'pre/sub'->'pre/sub'
添加每目录前缀:pre/sub->/pre/sub
添加路径信息后缀:/pre/sub->/pre/sub/sub
每个目录的条带前缀:/pre/sub/sub->pre/sub/sub
将模式“^(.*)$”应用于uri“pre/sub/sub”
正如您在第1行和第6行中看到的,正在进行一些后期修复。它显然将路径组件附加到当前处理的目录之上。当前处理的目录(.htaccess的位置)是文档根(
/
),因此它“期望”您处理当前目录级别的条目(
/pre
)。完成处理(使用RewriteRule)后,它会将嵌套路径组件附加到该结果

这就是为什么当您在同一目录级别上处理请求时,它不会产生任何问题,因为不需要追加任何内容

可以(并且官方建议)通过将
DPI
标志添加到该RewriteRule指令来修复该问题。DPI的意思是“丢弃路径信息”,它丢弃嵌套的路径组件,这些组件将被后置固定,因此不追加任何内容

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

这是它的官方错误报告。

DPI的文档flag

还有其他一些非常有用的话题

请看。。。这让我有些头痛。经过一番深入研究,我决定打开mod_rewrite的日志记录<代码>是我机器上文档根目录的绝对路径

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'
添加路径信息后缀:/pre->/pre/sub
每个目录的条带前缀:/pre/sub->pre/sub
将模式“^(.*)$”应用于uri“pre/sub”
重写'pre/sub'->'pre/sub'
添加每目录前缀:pre/sub->/pre/sub
添加路径信息后缀:/pre/sub->/pre/sub/sub
每个目录的条带前缀:/pre/sub/sub->pre/sub/sub
将模式“^(.*)$”应用于uri“pre/sub/sub”
正如您在第1行和第6行中看到的,正在进行一些后期修复。它显然将路径组件附加到当前处理的目录之上。当前处理的目录(.htaccess的位置)是文档根(
/
),因此它“期望”您处理当前目录级别的条目(
/pre
)。完成处理(使用RewriteRule)后,它会将嵌套路径组件附加到该结果

这就是为什么当您在同一目录级别上处理请求时,它不会产生任何问题,因为不需要追加任何内容

可以(并且官方建议)通过将
DPI
标志添加到该RewriteRule指令来修复该问题。DPI的意思是“丢弃路径信息”,它丢弃嵌套的路径组件,这些组件将被后置固定,因此不追加任何内容

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

这是它的官方错误报告。

DPI的文档flag

还有其他一些非常有用的话题