index.htmlredirect,同时使用Apache mod_rewrite维护静态index.html文件

这是我的目标:

  • /any-directory-or-subdirectory应显示/any-directory-or-subdirectory/index.html的内容
  • /any-directory-or-subdirectory/应该redirect到/any-directory-or-subdirectory (没有结尾的斜杠)
  • /any-directory-or-subdirectory/index.html应该redirect到/any-directory-or-subdirectory
  • /any-directory-or-subdirectory/something.htm我应该显示自己的内容。

我有这个工作在一个特定的目录完美:

 DirectorySlash Off RewriteEngine on RewriteRule ^specific-dir$ /specific-dir/index.html [L,E=LOOP:1] RewriteCond %{ENV:REDIRECT_LOOP} !1 RewriteRule ^specific-dir/$ /specific-dir [R=301,L] RewriteCond %{ENV:REDIRECT_LOOP} !1 RewriteRule ^specific-dir/index.html$ /specific-dir [R=301,L] 

我需要这个工作在所有的子目录,而不是一个特定的,也为同样的function在网站的根源。 我已经尝试了很多东西来适应这个代码的工作,但迄今为止还没有任何运气。

您不需要显式设置环境variables(例如LOOP )以避免redirect循环。 你可以使用Apache自己的REDIRECT_STATUS来达到这个目的。 当第一次处理请求时, REDIRECT_STATUS没有被设置,并且在第一次成功重写之后被设置为200 (如200 OK)。

我也会安排你的指令,以便外部redirect是在内部重写之前,因为这些总是需要首先执行。

为了使这个工作适用于任何目录,你可以为目录名设置一个正则expression式模式(或者如果处理任何级别的子目录,则应该使用完整的URLpath),并且包含一个检查请求是否映射到目录的条件。 例如,尝试如下所示:

 DirectorySlash Off RewriteEngine on # Strip trailing slash on directory # (The root always has a slash, but the browser doesn't show it) RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_FILENAME} -d RewriteRule (.+)/$ /$1 [R,L] # Strip trailing "/index.html" (including root) RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.*?)/?index\.html$ /$1 [R,L] # Rewrite directory request to directory index # (Any directory will already have had the trailing slash and "index.html" removed) RewriteCond %{REQUEST_FILENAME} -d RewriteRule (.*) /$1/index.html [L] 

(.*?)/?index\.html$ – 通过使捕获的组非贪婪(即。 (.*?) ),它不会捕获后面的可选斜杠。 如果确实如此,那么可能会将尾部斜线复制到replace,并导致额外的redirect(因为第一条规则稍后将删除它)。 并且通过在index.html可选之前创build所有内容,它也可以用于文档根目录。

只有在确定工作正常的情况下,才能将临时(302)redirect更改为永久(301)。 默认情况下,浏览器会严格caching301,因此可能会使testing出现问题。