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

我正在使用Apache来提供由静态HTML文件组成的博客。 目前,博客使用一个相当标准的URL结构,如下所示:

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

映射到该文件

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

使用Apache的mod_dir

我想删除结尾的斜杠,以便URLs

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

以同样的方式工作(不要redirect)。 有没有办法与Apache做到这一点?

(请注意,我希望URL后面的斜杠也能继续工作。)

(进一步说明:我看到了一些关于Apache的DirectorySlash指令,但我不认为它是做我想要的…虽然我不确定)。

您始终可以使用mod_rewrite将目录名redirect到不带尾部的斜杠到dirname/index.html 。 您可以使用RedirectConds,以确保redirect不会完成,如果URL以结尾的斜杠或.html结尾,并且它只适用于博客postURL。

让我来举个例子,这会花一点时间。

 # 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 

编辑:也可以结合马特的解决scheme,将redirect错误代码添加到RewriteRule。 它应该也可以作为最后的RedirectRule。 有关更多信息,请参阅mod_rewrite文档 。

Apache重写指南中有关于“尾随斜线问题”的一章 (向下滚动),解释了如何通过尾随斜线解决问题。

但是,他们还声明,当页面中的渲染页面使用相对链接的资源(图片,样式表,..)时,尾部的斜线是必需的。

“这个微妙的问题的解决办法是让服务器自动添加结尾的斜线,要正确地做到这一点,我们必须使用外部redirect,所以浏览器正确地请求后续的图像等。如果我们只做了一个内部重写,为目录页面工作,但是当任何图像被包含到这个页面中的相对URL时会出错,因为浏览器会请求一个内联的对象,例如,在/〜quux / foo / index中的image.gif请求.html会变成/~quux/image.gif没有外部redirect!

从URL中删除index.php可以通过在.htaccess(Apache中的mod_rewrite)文件中只写两行来完成。 在.htaccess中编写规则之前,请确保在Apache服务器中启用了mod_rewrite(RewriteEngine On)。 大多数情况下,mod_rewrite是在Linux服务器中启用的,但是对于Windows服务器,您可能需要联系托pipe人以启用mod_rewrite。 您可以通过在phpinfo()中查看来查看。

以下是将从URL中删除index.php的规则:

 RewriteCond %{THE_REQUEST} ^[AZ]{3,9} /([^/]+/)*index.php HTTP/ RewriteRule ^(([^/]+/)*)index.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L] 

redirect301意味着“永久移动”,所以大多数search引擎将从URL中删除index.php。

你读过DirectorySlash的定义了吗?

DirectorySlash指令确定mod_dir是否应修正指向目录的URL。

通常情况下,如果用户请求资源时没有指向目录的尾部斜线, mod_dir会将其redirect到相同的资源,但由于某些原因导致尾部斜线:

  • 用户最终请求资源的规范URL
  • mod_autoindex工作正常。 由于它不会在链接中发出path,所以会指向错误的path。
  • DirectoryIndex将仅针对以斜线结尾请求的目录进行评估。
  • HTML页面内的相对URL引用将正常工作。

那么,如果你不想要这个效果,上面的原因不适用于你,你可以关掉redirect:

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

我有同样的问题,但我使用mod_aliasbuild立一个子网站。 事实certificate,我需要做第二个别名没有结尾斜杠,以便它能正常工作。 看起来像这样:

 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。 在networking上的任何地方找不到这个答案; 我只是偶然发现,因为mod_rewrite不工作,DirectorySlash命令也没有帮助。 我在一个Drupal安装下追加了一个非Drupal程序作为子网站,这就是所有这些疯狂的开始…

你可能想尝试一个别名: http : //httpd.apache.org/docs/2.0/mod/mod_alias.html