使用 .htaccess 删除尾部斜杠

Posted

技术标签:

【中文标题】使用 .htaccess 删除尾部斜杠【英文标题】:Remove Trailing Slash With .htaccess 【发布时间】:2022-01-23 06:51:29 【问题描述】:

我查看了 Google 和 *** 的 5 页,但我似乎找不到使用 .htaccess 删除我的域中的尾部斜杠的方法。它使用 Litespeed。谁能提供我可以添加到文件中的代码?我会回复说它是否有效。谢谢!

【问题讨论】:

“删除我的 上的尾部斜杠” - 你能具体说明一下吗?如果您从字面上指的是主机名(即“域”)后面的斜杠,那么这是不可能的。主机名后面的斜杠(即 URL 路径的开头)是 HTTP 规范的一部分,不能删除。请参阅网站管理员堆栈上的以下问题:webmasters.stackexchange.com/questions/35643/… 我说的是文件夹。 “文件夹”在物理文件系统目录中? 这是一个例子:RyderCragie.com/Other/Wallpapers 您应该使用此附加信息更新您的问题...您不是在删除“我的域上的尾部斜杠”,而是“从物理文件系统目录中删除尾部斜杠” - 这是一个非常不同的问题。 【参考方案1】:

它们是物理目录。

您不能“简单地”从物理文件系统目录中删除尾部斜杠。我建议不要尝试这样做。

这与不映射到物理文件路径的任意“虚拟”URL 上的尾部斜杠非常不同。

Apache 要求目录尾部的斜杠能够正确地提供 DirectoryIndex 文档 (mod_dir) 并生成目录列表 (mod_autoindex)。

默认情况下,mod_dir 通过发出由浏览器持久缓存的 301(永久)重定向,将尾部斜杠显式附加到目录(如果省略)。

为了删除目录上的尾部斜杠(或防止它被附加),您需要覆盖此默认行为。但是您必须手动在尾部斜杠后面加上一个内部重写,这样 URL 才能按预期工作。

防止 mod_dir 附加尾部斜杠相对简单:

# Prevent mod_dir from appending trailing slashes to directories
DirectorySlash Off

# Prevent mod_autoindex generating directory listings
Options -Indexes

在设置DirectorySlash Off 时,确保禁用目录索引是一项额外的安全措施,因为没有尾部斜杠,DirectoryIndex 文档的存在不会阻止 mod_autoindex 生成目录列表并公开您的文件结构。

但是,如果请求物理目录时,您现在需要发出内部重写以“静默”附加尾部斜杠,例如:

# Append trailing slash on directories with an internal rewrite
RewriteCond $1 !/$
RewriteCond %REQUEST_FILENAME -d
RewriteRule (.+) $1/ [L]

实现了上述操作后,您应该已经在请求不带斜杠的 URL/目录。但是,如果您要更改此行为并且带有 尾部斜杠的 URL 已被搜索引擎索引或被第三方链接,那么您还需要实施外部重定向以按顺序删除尾部斜杠保持搜索引擎优化。为简单起见,我假设您希望从 all URL(不仅仅是物理目录)中删除尾部斜杠。

例如,在上述重写之前需要执行以下操作:

# Remove trailing slash if requested directly
# NB: Applies to ALL URLs, including directories
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule (.+)/$ /$1 [R=301,L]

需要检查REDIRECT_STATUS 环境变量的条件,以防止重定向循环。我们只想重定向来自客户端的直接请求,而不是稍后重写的重写请求。

注意:使用 302(临时)重定向进行测试以避免潜在的缓存问题。

您需要在测试前清除浏览器(和任何中间设备)缓存。

但是,正如我在答案顶部指出的那样,除非您有充分的理由这样做,否则我建议您不要实施此操作,因为您可能会遇到意外的冲突。归根结底,Apache 需要物理文件系统目录上的斜杠。


旁白:

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

这会从任意 URL 路径中删除尾部斜杠。这是您的“标准”斜杠删除规则。但是,这不会像您尝试做的那样从物理目录中删除尾部斜杠。有两个原因:

条件明确检查请求没有映射到物理目录。 在没有首先设置DirectorySlash Off 的情况下从物理目录中删除斜杠将导致重定向循环,因为 mod_dir 自然会尝试再次附加它。

【讨论】:

【参考方案2】:

您可以在.htaccess 中使用以下内容删除 URL 上的尾部斜杠:

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

为了您的测试,我建议使用R=302,因此它不是永久重定向,因为某些浏览器会无限期地缓存这些内容而无需完全清除缓存并在产品中使用R=301

【讨论】:

我当前的 .htaccess 文件可以在 RyderCragie.com/htaccess 找到。我应该把你的代码放在哪里? 将您的 htaccess 重命名为 .htaccess 并将答案中提供的代码放在您的 RewriteEngine On 行下方(您已经拥有此行,因此将其从复制的答案中删除)。 它已经被命名为 .htaccess。我刚刚复制了文件并将其重命名为 htaccess.txt。这就是您在RyderCragie.com/htaccess 看到的文件。我会将您的代码添加到 .htaccess 中,看看它是否有效。 不。它不起作用。我也更新了 txt 文件,所以你可以看到它的样子。请检查。

以上是关于使用 .htaccess 删除尾部斜杠的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 .htaccess 重定向 404 而不重定向尾部斜杠

htaccess:从以.xml / only结尾的URL中删除尾部斜杠

mod_rewrite:删除尾部斜杠(只有一个!)

从 Magento URL 中删除尾部斜杠

删除尾部斜杠重定向循环