它们是物理目录。
您不能“简单地”从物理文件系统目录中删除尾部斜杠。我建议不要尝试这样做。
这与不映射到物理文件路径的任意“虚拟”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 自然会尝试再次附加它。