这个RewriteRule的含义是什么?可以简化吗?

这个RewriteRule的含义是什么?可以简化吗?
RewriteRule ^he\/?(.*)$ "https\:\/\/example\.com\/$1" [R=301,L]

这个RewriteRule的含义是什么?可以简化吗?

我读了一遍又一遍,却每次都重新迷失。

它匹配,he/但我无法理解其余的所有内容。

答案1

解释

he它匹配以和开头的 uri 路径选修的 /,并捕获 uri 路径的其余部分(只有一组捕获括号,因此它被捕获为$1)。请注意,如果存在任何查询字符串,它不会捕获它们。

它将规则重写为https://example.com/$1

R=301标志告诉 apache 使用永久重定向代码 (301)。该L标志告诉 apache 停止处理此 uri 路径的任何进一步重写规则。即,如果还有更多规则,即使它们与模式匹配,也不会应用它们。

简而言之,它将he本地服务器上以 开头的任何 URI 重定向到he/ or上的相同 URI(不带 he`` 前缀)https://example.com/,例如he/foo.html重定向到https://example.com/foo.html

简化

ModRewrite 规则中的模式或替换不需要转义正斜杠,因此可以简化为:

RewriteRule ^he/?(.*)$ https://example.com/$1 [R=301,L]

顺便说一句,如果这是为了重定向he/文档根目录子目录中的所有内容,它就会这样做。它会捕获文档根目录中以 开头的任何 .html 或其他文件he,例如hello.html将被重定向到https://example.com/llo.html

如果您不希望它这样做,请删除?后的/.在正则表达式中,?意味着匹配前面的元素零次或一次(即匹配它是可选的)。如果您希望/模式匹配需要 ,那么不要将其设为可选 - 请改用:

RewriteRule ^he/(.*)$ https://example.com/$1 [R=301,L]

但是,he如果 uri 不以/.为此,您需要:

RewriteRule ^he($|/.*$) https://example.com$1 [R=301,L]

IMO,上面的规则可能是您真正想要的......但如果/您想要的是可选的,那么/?模式中不需要 - 它仍然会匹配带或不带/after 的URI he

RewriteRule ^he(.*)$ https://example.com/$1 [R=301,L]

URI 问题?

最后,我不知道你的 apache 服务器是如何设置的,但我怀疑你应该在模式/之前有一个he,因为 apache 重写规则所看到的 URI 通常以 开头/,例如:

RewriteRule ^/he($|/.*$) https://example.com$1 [R=301,L]

相关内容