Let*_*ety 13 regex apache .htaccess redirect
我已将网站中的许多网址从:/folder/page.php移至: /folder/page/。
现在我想将旧 url 重定向到新 url,所以我添加了.htaccess这个规则:
RedirectMatch permanent /folder/(.*)\.php https://www.site.it/folder/$1/
Run Code Online (Sandbox Code Playgroud)
但它不起作用,此规则首先重定向到/folder/page/然后再次重定向到/folder/page/index/
所以我试过这个:
RedirectMatch permanent /folder/(?!index)\.php https://www.site.it/folder/$1/
Run Code Online (Sandbox Code Playgroud)
但它的工作原理类似于上述规则。
我也测试过:
RedirectMatch permanent /folder/(?!index)(.*)\.php https://www.site.it/folder/$1/
Run Code Online (Sandbox Code Playgroud)
又一样。
我.htaccess只在根文件夹中使用,这里是新规则之前的内容:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)
这些规则需要将http流量重定向到https我使用的网络托管服务并由其建议。
我还测试了错误的RedirectMatch规则,没有任何其他规则。
如何重定向所有页面,除了index.php?
这是 url 列表和所需的行为:
RedirectMatch permanent /folder/(.*)\.php https://www.site.it/folder/$1/
Run Code Online (Sandbox Code Playgroud)
请不要建议使用 mod_rewrite,因为它不是此处描述的最佳实践。
您可以在现有规则下方添加新规则:
RewriteCond %{THE_REQUEST} \s(/folder/[\w-]+)\.php[?\s] [NC]
RewriteRule ^ %1/ [L,R=301]
Run Code Online (Sandbox Code Playgroud)
THE_REQUEST只匹配客户端发送的原始 URI,它不会匹配 modified REQUEST_URI。
我发现了这个问题:匹配除指定字符串之外的所有内容,帮助我修复正则表达式。
RedirectMatch permanent /folder/(?!.*(index))(.*)\.php https://www.site.it/folder/$2/
Run Code Online (Sandbox Code Playgroud)
该规则匹配除index之外的所有内容,因此仅重定向/folder/page.php一次,但不幸的是,正如 @anubhava 指出的那样,该规则与包含index/folder/page/的任何页面名称不匹配。
经过进一步挖掘,我找到了这个解决方案:
RedirectMatch permanent /folder/(?!index.php$|$)(([\w-]+)\.php$) https://www.site.it/folder/$2/
Run Code Online (Sandbox Code Playgroud)
无论如何,感谢支持我的@anubhava。