如果文件“/index.html”实际上不存在,如何将“/”重定向到“/home.html”?

时间:2010-09-15 12:32:02

标签: apache file .htaccess mod-rewrite

我找到了一种方法来重定向(不加载,但更改网址)“/”为“/home.html”。现在我想添加RewriteCond以避免重定向,如果文件“/index.html”存在。

我尝试过(没有评论),但没有奏效:

# We check that we comes from "domain.tld/"
RewriteCond %{REQUEST_URI} =/

# We check that there is no index.html file at the site's root
RewriteCond %{REQUEST_URI}index\.html !-f

# We redirect to home.html
RewriteRule ^(.*)$ %{REQUEST_URI}home\.html [R=301,L]

帮助我Obi-wan Kenobi ......你是我唯一的希望!


@Gumbo

它比上面的例子复杂一点。事实上,我使用相同的.htaccess管理localhost和生产开发,所以我尝试了这样的事情(按照你的回答):

# Redirect domain.tld/ to domain.tld/home.html (only if domain.tld/index.html does not exists)
RewriteCond %{DOCUMENT_ROOT}index\.html !-f [OR]
RewriteCond %{DOCUMENT_ROOT}domain.tld/www/index\.html !-f
RewriteRule ^$ %{REQUEST_URI}home\.html [R=301,L]

我查看了“%{DOCUMENT_ROOT} domain.tld / www / index.html”返回的路径,它正好是我的index.html文件的路径......尽管如此,它也没有用。 :(

顺便说一句,感谢“^ $”避免“%{REQUEST_URI} = /”! \ O /

知道为什么吗?

3 个答案:

答案 0 :(得分:1)

文件检查-f需要有效的文件系统路径。但%{REQUEST_URI}index\.html不是文件系统路径,而是URI路径。您可以使用-F代替通过子请求检查是否存在。或使用 DOCUMENT_ROOT 构建有效的文件系统路径:

RewriteCond %{DOCUMENT_ROOT}/index.html !-f
RewriteRule ^$ %{REQUEST_URI}home.html [R=301,L]

此外,可以使用RewriteRule的模式完成另一个条件。当您在.htaccess文件中使用mod_rewrite时,将删除相应的路径前缀(如果是文档根目录:/),则剩余路径为空字符串(由^$匹配)。

答案 1 :(得分:1)

如果您有权访问httpd.conf(apaches配置文件),可以在那里设置默认页面。

这样的事情:

<IfModule dir_module>  
    DirectoryIndex index.html home.html
</IfModule>

答案 2 :(得分:0)

根据您在更新中发布的规则集,您会发生一些逻辑错误。现在,您的RewriteCond条件之一将永远是正确的,因为两个索引文件似乎永远不会存在于同一环境中(一个存在于开发中,另一个存在于生产中)。由于您已将它们“或”在一起,这意味着由于条件阻止,您的RewriteRule将永远不会被忽略。

修复很简单(我还添加了额外的正斜杠,因为DOCUMENT_ROOT通常是doesn't have a trailing slash):

RewriteCond %{DOCUMENT_ROOT}/index.html !-f
RewriteCond %{DOCUMENT_ROOT}/domain.tld/www/index.html !-f
RewriteRule ^$ %{REQUEST_URI}home.html [R=301,L]

另请注意,您可以使用本地主机名设置virtual host,以便您的开发和生产在相对路径方面类似。