重新保存固定链接后,.htaccess重定向消失

时间:2021-02-26 作者:x-alien23

我希望我的WordPress网站加载https+非www,并且没有斜杠。我输入了以下代码.htaccess 文件:

<IfModule mod_rewrite.c>
 RewriteEngine On
 # Remove trailing slash from non-filepath urls
 RewriteCond %{REQUEST_URI} /(.+)/$
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^ https://example.com/%1 [R=301,L]
 # Force HTTPS and remove WWW
 RewriteCond %{HTTP_HOST} ^www\\.(.*)$ [OR,NC]
 RewriteCond %{https} off  
 RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
</IfModule>
这些规则工作正常,但我无法删除域后的多个斜杠。网站加载:https://example.com///// 我希望它重定向到https://example.com

此外,如果这些规则仅在.htaccess 当我重新保存永久链接时,规则就会消失。。。

你能帮帮我吗

2 个回复
最合适的回答,由SO网友:MrWhite 整理而成

要将URL路径开始处的多个斜杠(或实际上URL路径中的任何位置)减少为一个斜杠(URL路径开始处始终至少有一个斜杠,即使您看不到这是浏览器的地址栏),可以使用如下指令:

# Reduce multiple slashes to single slashes
RewriteCond %{THE_REQUEST} \\s[^?]*//
RewriteRule (.*) /$1 [R=301,L]
这使用了以下事实,即RewriteRule <模式已经减少了多个斜杠。前面的条件检查初始请求的URL路径中是否有多个斜杠。

您可以将上述规则放在现有规则之间的第二个位置。并修改删除尾部斜杠的第一条规则,以减少多个斜杠,从而防止在请求同时包含多个斜杠和尾部斜杠时出现不必要的额外重定向。例如:

# Remove trailing slash from non-directory URLs AND reduce multiple slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ https://example.com/$1 [R=301,L]

# Reduce multiple slashes to single slashes
RewriteCond %{THE_REQUEST} \\s[^?]*//
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Force HTTPS and remove WWW
RewriteCond %{HTTP_HOST} ^www\\. [OR,NC]
RewriteCond %{https} off  
RewriteRule (.*) https://example.com/$1 [R=301,L]
我刚刚整理了RewriteCond 检查HTTP_HOST 服务器变量。^www\\.(.*)$ 可以简化为^www\\. 因为这里没有使用backreference。

您不需要<IfModule> 包装器。

测试前请清除浏览器缓存,最好先使用302(临时)重定向进行测试,以避免潜在的缓存问题。

此外,如果这些规则仅位于的开头,则它们也会起作用。htaccess文件,当我重新保存永久链接时,规则就会消失.htaccess 文件,位于WordPress前端控制器之前。

但是,他们必须在# BEGIN WordPress 部分不在此块内,否则它们将被覆盖,因为WP本身维护此代码块。

如果将它们放在# BEGIN WordPress 注释标记。

SO网友:JMau

防止WordPress修改您的。htaccess,您也可以

add_filter(\'flush_rewrite_rules_hard\', \'__return_false\');

“A”;“硬”;刷新更新。htaccess(Apache)或web。配置(IIS)。