多个.htaccess文件互相冲突
问题描述:
我有一个托管在其上的多个域的共享主机。在我的主机的根文件夹中存在一个.htaccess(比如说是htaccess1)。在HT1代码:多个.htaccess文件互相冲突
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?mydomain.com$ [NC]
RewriteCond %{REQUEST_URI} !^/mydomain/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mydomain/$1
RewriteCond %{HTTP_HOST} ^(www.)?mydomain.com$ [NC]
RewriteRule ^(/)?$ mydomain/index.php [L]
这些规则存在,只有拥有www.mydomain.com
所使用的网址mydomain
文件夹中的所有文件。我是新的URL重写,所以我不明白每行的意义。另一个.htaccess(如htaccess2)文件存在于mydomain
文件夹中。代码是htaccess2是:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]+)?/$ try.php?id=$1
RewriteRule ^([0-9]+)?$ try.php?id=$1
RewriteRule ^post/([0-9]+)?/$ post.php?id=$1
RewriteRule ^post/([0-9]+)?$ post.php?id=$1
在这个文件中,行6,7工作正常,并重定向与数值参数要求try.php
但线8,9不工作,给一个404页没有发现错误,确切的错误字符串是:
在此服务器上找不到请求的URL/mydomain/post/1233445。
我怀疑htaccess1的某些作用是否造成这个问题,因为我在第8,9行尝试了许多正则表达式的变体。请帮忙。
答
主要的.htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase/
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/mydomain/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mydomain/$1 [L]
RewriteCond %{HTTP_HOST} ^(www\.)?mydomain\.com$ [NC]
RewriteRule ^$ /mydomain/index.php [L]
变化:
- 添加RewriteBase在顶部。
- 添加了
L
标志标记它的最后一个规则。 - 添加了必要的选项。
MYDOMAIN的.htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase /mydomain/
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^post/([0-9]+)/?$ post.php?id=$1 [L,QSA,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]+)/?$ try.php?id=$1 [L,QSA]
变化:
- 添加RewriteBase在顶部。
- 增加了L标记来标记它的最后一个规则。
- 删除了冗余规则。
- 将特定规则移到通用规则上方。
- 添加了必要的选项。
'RewriteCond'按照第一个'RewriteRule'工作,除非您使用类似skip的跳过来跳过失败的匹配。 – 2013-04-30 18:40:33