.htaccess 重写以在末尾强制使用斜杠

Posted

技术标签:

【中文标题】.htaccess 重写以在末尾强制使用斜杠【英文标题】:.htaccess Rewrite to Force Trailing Slash at the end 【发布时间】:2011-12-08 12:19:49 【问题描述】:

我的 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 有多长都能正常工作?

谢谢!

【问题讨论】:

【参考方案1】:

接受的答案对我不起作用。确实如此,来自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 /。至少,当我删除它时,它停止了工作。

【讨论】:

【参考方案2】:

一个更可靠的答案,基于the answer above:

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

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

【讨论】:

我试过了,但它在以 .html 结尾的文件上添加了一个斜杠 如果 URL 指向一个真实的文件,它不应该符合这个规则;您是否不必要地将.html 添加到您的“好”网址中? 不是我,但我猜 Magento 是!感谢您的回复,但我确实找到了一个重定向,它只将其添加到没有扩展名的 URL:paulund.co.uk/using-htaccess-to-force-trailing-slash 这个答案也为我创造了奇迹。我遇到的唯一问题是我的重定向指向一个奇怪的服务器路径。我通过添加RewriteBase / 解决了这个问题。这使得重定向工作就像一个魅力! 这对我来说非常有效。谢谢!在尝试此或任何解决方案时,请记住清除浏览器的缓存。【参考方案3】:

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

RewriteEngine on

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

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

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

RewriteCond %REQUEST_FILENAME !-f

【讨论】:

【参考方案4】:
<rule name="Remove trailing slash" stopProcessing="true">
    <match url="^([^.]+)/$" />

将此规则添加到您的配置文件中,它对我有用

【讨论】:

您应该将代码行添加到您的答案中,而不是评论它!【参考方案5】:

由于规则末尾的强制斜线,上述示例对我不起作用,例如$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`

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

这对我来说非常有效。 (来自用户 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> 

【讨论】:

【参考方案8】:

虽然Death's solution 有效,但当您忘记将某些文件类型添加到列表中时可能会很烦人。您可以这样做来强制所有不直接指向文件的 URL 使用尾部斜杠,在条件中使用 !-f

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

【讨论】:

我试过了,但它在以 .html 结尾的文件上添加了一个斜杠 我也试过了,但仍然看到像 sitemap.xml 这样的页面添加了斜杠。服务器设置是否有可能决定将哪些文件视为要下载的文件和要在浏览器中呈现的文件,这会影响 !-f 的解释方式?【参考方案9】:
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]

【讨论】:

您可能还想包含 css 和 js。这很有用! @undone 请问html后面的?代表什么,为什么你没有把php?加上问号? @DanFromGermany 正则表达式中的问号表示字符串中可能存在也可能不存在前面的字符(在本例中为 l)。所以 in 可以同时涵盖 htmhtml 扩展!【参考方案10】:
RewriteRule ^(.*)[^/]$ $1/ [L,R=301]

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

【讨论】:

此解决方案也会在文件中添加斜线!

以上是关于.htaccess 重写以在末尾强制使用斜杠的主要内容,如果未能解决你的问题,请参考以下文章

Htaccess:从URL添加/删除尾部斜杠

htaccess mod 用斜杠将 $_GET 重写为变量

在.htaccess中将ID重写为斜杠

.htaccess 和 Apache ModSecurity

模式重写;网址末尾有/没有斜杠?

在每个 url 的末尾添加斜杠(需要为 nginx 重写规则)