HTACCESS mod重写,堆叠规则

时间:2012-10-29 16:41:24

标签: .htaccess mod-rewrite

我们有一个重写规则,如下所示:

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?

1 个答案:

答案 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]