我们有一个重写规则,如下所示:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]
哪个按预期工作;如果该文件不存在,请转发到page.php这是一个通用页面,并允许包含自定义URL的页面。
我们也想强迫www。在域之前:example.com - > www.example.com
为此,我们使用:
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
这也有效,但当这两者应该一起工作时:
example.com/non-existent-file
我们最终得到:
www.example.bom/page.php
默认为404页面。如何修改这些规则以协同工作?我尝试过玩一些不同的字符(即删除[NC,L]中的L,试图让两个规则都处理完毕)。
我也尝试过重复www重定向下面的forward.php行(并删除L后缀)但没有成功。
整个HTACCESS文件如下所示:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=302,L]
此外,我是否可以使用%{CONSTANT}代替当前域名的example.com?
答案 0 :(得分:1)
您正在寻找的常量是 %{HTTP_HOST}
,由HTTP请求提供。也许您正在为虚拟主机的默认服务器名寻找变量%{SERVER_NAME}
?
首先放置主机名检查规则,并使用RewriteCond
规则中的page.php
仅在域已经正确的情况下才适用:
RewriteEngine On
# First rewrite the domain
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Then rewrite the files
# At this point, the domain should already have been enforced
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]