使用 Apache 的默认目录索引文件时,如何从 URL 中删除尾随斜杠?

使用 Apache 的默认目录索引文件时,如何从 URL 中删除尾随斜杠?

我正在使用 Apache 来为由静态 HTML 文件组成的博客提供服务。目前,该博客使用非常标准的 URL 结构,如下所示:

/2010/03/21/my-awesome-blog-post/

映射到文件

/2010/03/21/my-awesome-blog-post/index.html

使用 Apache 的mod_dir

我想删除尾部的斜杠,以便像

/2010/03/21/my-awesome-blog-post

以相同的方式工作(并且不会被重定向)。有没有办法使用 Apache 来实现这一点?

(请注意,我想要 URL尾部斜杠也可以继续工作。)

(进一步说明:我看到了一些关于 Apache 的DirectorySlash指令,但我不认为它实现了我想要的效果......尽管我对此并不确定。)

答案1

您始终可以使用 mod_rewrite 将不带尾部斜杠的目录名称重定向到dirname/index.html。您可以使用 RedirectConds 来确保如果 URL 以尾部斜杠或 .html 结尾,则不会进行重定向,并且它仅适用于博客文章 URL。

让我举一个例子,这需要一点时间。

# Trailing slashes and .html suffix
RewriteCond !/$
RewriteCond !\.html$

# Check if it's actually a dir and if index.html exists
RewriteCond %{REQUEST_URI} -d
RewriteCond %{REQUEST_URI}/index.html -f

# Rewrite anything that gets through (Probably insecure, but you get the idea)
RewriteRule ^(.*)$ $1/index.html

编辑:也可以与 Matt 的解决方案相结合,将重定向错误代码添加到 RewriteRule。它可能也应该成为最后一个 RedirectRule。请参阅mod_rewrite 文档了解更多信息。

答案2

Apache Rewrite 指南有关于“尾部斜线问题”的一章(向下滚动一点)解释如何解决尾随斜杠的问题。

然而,他们还指出,当目录中呈现的页面使用带有相对链接的资源(图像,样式表等)时,目录中需要有尾随斜杠 - 如果没有斜杠,则无法工作:

“解决这个微妙问题的方法是让服务器自动添加尾部斜杠。要正确执行此操作,我们必须使用外部重定向,以便浏览器正确请求后续图像等。如果我们只进行内部重写,这只适用于目录页面,但当任何图像通过相对 URL 包含在此页面中时会出错,因为浏览器会请求内联对象。例如,如果没有外部重定向,对 /~quux/foo/index.html 中的 image.gif 的请求将变为 /~quux/image.gif!”

答案3

你读过目录斜杠

DirectorySlash指令决定是否mod_dir应该修复指向目录的 URL。

通常,如果用户请求不带尾部斜杠(指向目录)的资源,mod_dir 则会将他重定向到相同的资源,但出于某些原因,尾部带有斜杠:

  • 用户最终请求资源的规范 URL
  • mod_autoindex工作正常。由于它不发出链接中的路径,因此它会指向错误的路径。
  • DirectoryIndex仅对带有尾部斜杠的请求目录进行评估。
  • HTML 页面内的相对 URL 引用将正常工作。

好吧,如果您不想要这种效果并且上述原因不适用于您,您可以使用以下方法关闭重定向:

# see security warning below!
<Location /some/path>
DirectorySlash Off
SetHandler some-handler
</Location>

答案4

我遇到了同样的问题,但我使用 mod_alias 设置子站点。结果,我需要创建一个不带尾部斜杠的第二个别名,这样它才能正常工作。看起来像这样:

Alias /forum/ "/var/www/forum"
Alias /forum "/var/www/forum"

<Directory "/var/www/forum">
    Options FollowSymlinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

在 Ubuntu 中,我必须编辑/etc/apache2/mods-enabled/alias.conf使用这些行创建一个文件,然后重新启动 apache。在网络上找不到这个答案;我自己偶然发现了它,因为 mod_rewrite 不起作用,DirectorySlash 命令也没有帮助。我在 Drupal 安装下附加了一个非 Drupal 程序作为子站点,这首先引发了所有这些疯狂的事情……

相关内容