我不知所措,试图找出问题所在:
我有以下重定向规则:
RewriteRule ^/productname(.*) https://website.com/category [R=301,NC,L]
但是它不起作用,我不明白为什么。因为这条规则:
Redirect 301 ^/productname(.*) https://website.com/category/subcategory/productname
工作正常。
非常感谢您的帮助
答案 0 :(得分:1)
RewriteRule ^/productname(.*) https://website.com/category [R=301,NC,L]
这不适用于每个目录的.htaccess
文件,因为与RewriteRule
pattern 匹配的URL路径小于目录前缀( .htaccess
文件所在的位置)。目录前缀始终以斜杠结尾,因此与RewriteRule
pattern 匹配的URL路径永远不会以斜杠开头。
来自Apache docs for the RewriteRule
directive:
在每个目录上下文(目录和.htaccess)中,模式仅与部分路径匹配,例如,对“ /app1/index.html”的请求可能与“ app1 / index.html”进行比较或“ index.html”,具体取决于定义RewriteRule的位置。
在比较之前,将定义规则的目录路径从当前映射的文件系统路径中剥离(直到并包括尾斜杠)。按目录前缀剥离的最终结果是,在这种情况下,规则仅与定义规则的当前映射文件系统路径“以下”部分匹配。
因此,您需要删除斜杠前缀,例如:
RewriteRule ^productname https://website.com/category [R=301,NC,L]
(.*)
上的结尾RewriteRule
在此示例中是多余的。
Redirect 301 ^/productname(.*) https://website.com/category/subcategory/productname
此规则无法“正常运行”。我认为您的意思是RedirectMatch
。
请注意,RewriteRule
和Redirect
(以及RedirectMatch
)属于不同的模块。 mod_rewrite和mod_alias-您应该避免混合使用来自两个模块的重定向,否则可能会导致意外冲突。