.htaccess Apache htaccess强制小写并删除尾部斜杠

gr8qqesn  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(130)

我尝试将所有网址重定向为小写,并删除尾随斜线。
我的htaccess文件现在看起来像这样:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
    RewriteRule [A-Z] %1 [R=308,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [R=308,L]
</IfModule>

这确实有效,但是它一个接一个地进行了两次重定向。第一次重定向强制小写,第二次重定向删除尾部斜杠。
如何将这两个规则合并为一个重定向?

5ssjco0h

5ssjco0h1#

您不需要为了减少重定向次数而实际合并这两个规则。您可以颠倒这两个规则的顺序,并始终在删除尾部斜杠的规则中将URL转换为小写。
例如:

# Remove trailing slash AND convert to lowercase
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond expr "tolower(%{REQUEST_URI}) =~ m#(.+)/$#"
RewriteRule /$ %1 [R=308,L]

# Convert remaining URLs to lowercase
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
RewriteRule [A-Z] %1 [R=308,L]

将这两个规则结合使用(不增加额外的复杂性)的一个潜在问题是,您避免了将Map到目录的URL转换为小写(这可能是个问题,也可能不是个问题),因为您只能删除非目录上的尾随斜杠。
注意,我在第一个规则(以前是第二个规则)中使用了另一种regex语法,以避免在regex中转义斜杠。RewriteRulepattern 现在也可以简化,因为我们只需要AssertURL以尾随斜杠结尾。
请注意,如果这些指令是必需的,则应删除<IfModule> Package 。

相关问题