.htaccess在最后重写强制尾随斜线

时间:2011-10-15 21:47:57

标签: .htaccess url mod-rewrite

我的htaccess文件中有以下代码:

# Force Trailing Slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]

当我去 www.mydomain.com/test 时,它似乎工作正常,它将其重定向到/ test /。问题是,当我去 www.mydomain.com/test/another 时,它不会将斜杠放在另一个上。

有没有人知道如何修改我的代码以使尾随斜杠无论URL多长都有效?

谢谢!

10 个答案:

答案 0 :(得分:67)

基于the answer above

的更为健全的答案
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)([^/])$        /$1$2/ [L,R=301]

RewriteCond将检查以确保没有具有该名称的文件,如果没有,则执行RewriteRule。比拥有手动扩展名列表更具前瞻性!

答案 1 :(得分:30)

RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]

编辑:如果您要排除某些请求,例如php文件:

RewriteCond %{REQUEST_URI}  !\.(php|html?|jpg|gif)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]

答案 2 :(得分:5)

Death's solution工作时,如果您忘记将某些文件类型添加到列表中,则会很烦人。您可以对条件中使用!-f的所有未直接指向文件的URL强制使用尾部斜杠。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301]

答案 3 :(得分:2)

接受的答案对我没有用。这样做来自SEOMoz

# Ensure all URLs have a trailing slash.
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

请注意每个规则的RewriteBase /。至少,当我删除它时,它停止了工作。

答案 4 :(得分:0)

RewriteRule ^(.*)[^/]$ $1/ [L,R=301]

这应该很好用。它只是检查以确保尾随字符不是斜杠并添加一个。

答案 5 :(得分:0)

这对我来说非常合适。 (来自用户Ajax的评论)
其他链接的问题是我的CSS在应用重定向规则后停止工作但CSS也可以正常使用以下重写规则

RewriteRule ^((.*)[^/])$ $1/ [L,R=301]

完整代码

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(.*)/$
    #Force Trailing slash
    RewriteRule ^((.*)[^/])$ $1/ [L,R=301]
</IfModule> 

答案 6 :(得分:0)

这对我来说很好,并且不依赖于评估实际文件,因为有些人建议使用'-f'标志:

RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC]
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]

答案 7 :(得分:0)

上面的例子对我来说并不适用,这要归功于规则末尾的强制削减,例如: $ 1 $ 2 /。

对我来说这是(我用它来进行wordpress并重定向到HTTPS)。您必须在RewriteEngine和RewriteBase行后面添加条件和规则行:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`

答案 8 :(得分:0)

要强制使用尾部斜杠,您可以使用:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R]

注意mod-dir模块在​​mod-rewrite看到请求existant dir时自动添加尾部斜杠之前运行,因此我们必须从规则中排除目录,否则使用规则在某些服务器上没有RewriteCond %{REQUEST_FILENAME} !-d的情况下,如果您关闭了directorySlash,则最终会出现/dir//,否则会导致问题。

上面的规则为所有请求添加了一个斜杠,包括带扩展名的文件,如果您不希望文件带有斜杠,可以通过在规则上方添加以下条件来排除它们

RewriteCond %{REQUEST_FILENAME} !-f

答案 9 :(得分:-3)

<rule name="Remove trailing slash" stopProcessing="true">
    <match url="^([^.]+)/$" />

在配置文件中添加此规则,它对我有用