【问题标题】:remove trailing slash with htaccess使用 htaccess 删除斜杠
【发布时间】:2025-12-19 20:55:12
【问题描述】:

我想删除文件结尾 (.html) 和 url 中的尾部斜杠。当用户输入请求 ttp://example.com/jobs/director.html 他应该被重定向到http://example.com/jobs/director。这在大多数情况下非常有效,但是当页面名称等于子目录的名称时,不会删除尾部斜杠,并且服务器会尝试像这样解析路径:/jobs/.html(本例中的请求是 @987654322 @)。有人知道解决方案吗?我真的被困住了。谢谢!

我的文件结构:

  • 工作(目录)

  • jobs/artist.html

  • jobs/director.html

  • index.html

  • jobs.html

我的 .htaccess 文件:

Options +FollowSymLinks
RewriteEngine On
DirectorySlash Off

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]

# remove .html file ending
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

【问题讨论】:

  • 如果您希望通过/jobs 访问jobs.html,那么服务器应该如何知道是否请求了HTML 文件或文件夹?这不是一个好的设置,即使您现在设法解决了这个问题,也可能在未来导致更多问题。我强烈建议您将这两个名称中的任何一个更改为不同的名称。
  • “但是当页面名称等于子目录的名称时,尾部斜杠不会被删除” - 很确定它 - 但是然后将不带斜杠请求的目录重定向到带有斜杠的版本的默认机制将启动,并撤消您的删除...DirectorySlash 指令控制此行为,但在您弄乱它之前,我建议您阅读文档非常仔细。
  • 我无法更改结构,因为我需要拥有职位子页面(职位/艺术家、职位/导演)。我可以将目录中的 jobs.html 作为 index.html 移动,但我读过只有在 DirectorySlash 打开时才请求 DirectoryIndex。感谢文档的链接,我是这个主题的新手,但它已经得到很好的解释,我现在明白当我关闭 DirectorySlash 时我必须小心。

标签: regex apache .htaccess


【解决方案1】:

你可以使用:

Options +FollowSymLinks
RewriteEngine On
DirectorySlash Off

# remove trailing slash to non-directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/$ /$1 [R=302,L]

# add trailing slash internally to directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+?[^/])$ $1/ [L]

# add .html file ending internally
RewriteCond %{DOCUMENT_ROOT}/$1\.html -f
RewriteRule ^(.+?)/?$ $1.html [L]

【讨论】:

  • 感谢您的回答,这行得通!我想这个解决方案是否对性能不利(如果可以通过更少的重定向来解决),但我对这个话题很陌生。在阅读了一些文档后,我认为最好的解决方案是使用 DirectoryIndexes 解决它(我可以将目录作业中的 jobs.html 移动并将其重命名为 index.html),但我认为这是不可能的,因为我关闭了 DirectorySlash。
  • 谢谢你是对的,我不明白外部重定向和内部重写之间的区别!
  • 对于真实目录,要么触发第一条规则,要么触发第二条规则,因为一个具有!-d 条件,另一个具有-d 条件,因此不存在性能问题。
  • 我对这个解决方案有一个问题,当请求一个带有斜杠的子页面时(例如example.com/jobs/artist),然后将内部服务器路径附加到url(example.at/var/www/vhosts/internal-server-path/jobs/artist