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]