.htaccess最后重写为强制结尾斜杠

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

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

这似乎工作正常,当我去www.mydomain.com/testredirect到/testing/。 问题是,当我去www.mydomain.com/test/another它不会把斜杠放在另一个。

有没有人知道如何修改我的代码,无论URL的长度是多less,都要使尾部的斜杠起作用。

谢谢!

 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] 

基于上面的答案,一个更健壮的答案 :

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

RewriteCond将检查以确保没有该名称的文件,如果没有,执行RewriteRule。 有更多的将来certificate,比手动列表的扩展!

虽然死亡的解决scheme的作品,当你忘记添加某些文件types的列表可能是烦人的。 您可以执行此操作,强制在条件中使用!-f不直接指向文件的所有URL的尾部斜杠。

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

接受的答案不适合我。 这从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 / 。 至less,当我删除它,它停止工作。

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

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

这对我来说是完美的。 (来自用户Ajax的评论)
其他链接的问题是我的CSS停止工作后,应用redirect规则,但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> 

这对我来说工作得很好,而且不依赖于对某个实际文件的评估,因为有些人提出了'-f'标志:

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

上面的例子没有为我工作,感谢在规则的末尾强制斜线,例如$ 1 $ 2 /。

对我来说,这工作(我用它的WordPress和redirect到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` 

要强制结尾的斜杠,可以使用:

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

注意在mod-rewrite之前运行的mod-dir模块在看到existant dir的请求时自动添加尾部斜线,所以我们必须从规则中排除目录,否则使用规则而不使用RewriteCond %{REQUEST_FILENAME} !-d on一些服务器,你最终会在/dir//或它可以导致问题,如果你已经closures目录的闪存。

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

 RewriteCond %{REQUEST_FILENAME} !-f 
 <rule name="Remove trailing slash" stopProcessing="true"> <match url="^([^.]+)/$" /> 

将这个规则添加到你的configuration文件中,它正在为我工​​作