我的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多长都有效?
谢谢!
答案 0 :(得分:67)
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="^([^.]+)/$" />
在配置文件中添加此规则,它对我有用