我找到了一种方法来重定向(不加载,但更改网址)“/
”为“/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 /
知道为什么吗?
答案 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,以便您的开发和生产在相对路径方面类似。