我正在使用 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 程序作为子站点,这首先引发了所有这些疯狂的事情……