我正试图了解RewriteCond,并希望将任何请求重写为静态html页面(如果存在)或特定index.php(只要请求的文件不存在) )。
说明逻辑:
if HTTP_HOST is '(www\.)?mydomain.com'
if file exists: "/default/static/{REQUEST_URI}.html", then
rewrite .* to /default/static/{REQUEST_URI}.html
else if file exists: {REQUEST_FILENAME}, then
do not rewrite
else
rewrite .* to /default/index.php
当我不需要测试HTTP_HOST时,我似乎没有太多麻烦。最终,这个.htaccess文件将处理多个域的请求。
我知道我可以用vhosts来解决这个问题,但我想知道如何这样做。
我对其他一些标志不太熟悉,它们中的任何一个都可以使用(比如链| C,下一个| N或跳过| S)?
提前致谢!
更新:我已经设法做到了,但会欣赏替代方案:
RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC]
RewriteCond %{DOCUMENT_ROOT}/%1/static/%{REQUEST_URI}.html -f
RewriteRule (.*)? /%1/static/$1.html [NC,L]
RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /%1/index.php [L,QSA]
更新#2:在Gumbo的回答的帮助下,想出了另一个。我喜欢在添加域的情况下这需要较少的维护。 (谢谢Gumbo!)
我有什么理由不设置ENV变量吗?
RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..*$ [NC]
RewriteRule ^ - [E=APP:%1]
RewriteCond %{DOCUMENT_ROOT}/%{ENV:APP}/static/%{REQUEST_URI}.html -f
RewriteRule (.*)? /%{ENV:APP}/static/$1.html [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /%{ENV:APP}/index.php [L,QSA]
答案 0 :(得分:5)
我可能会这样做:
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$
RewriteRule ^ - [S=2]
RewriteCond %{DOCUMENT_ROOT}/default/static%{REQUEST_URI}.html -f
RewriteRule !^default/static/ default/static%{REQUEST_URI}.html [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^default/static/ default/index.php [L]
这与您更新的示例类似。如果主机不合适,则第一条规则将跳过以下两条规则。 RewriteRule
模式排除了以/default/static/
开头的任何路径。但是你的规则已经非常好了。