多个.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行尝试了许多正则表达式的变体。请帮忙。

+0

'RewriteCond'按照第一个'RewriteRule'工作,除非您使用类似skip的跳过来跳过失败的匹配。 – 2013-04-30 18:40:33

主要的.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] 

变化:

  1. 添加RewriteBase在顶部。
  2. 添加了L标志标记它的最后一个规则。
  3. 添加了必要的选项。

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] 

变化:

  1. 添加RewriteBase在顶部。
  2. 增加了L标记来标记它的最后一个规则。
  3. 删除了冗余规则。
  4. 将特定规则移到通用规则上方。
  5. 添加了必要的选项。
+0

你能详细阐述一下你做了哪些改变? – Sourabh 2013-04-30 18:45:02

+0

@Sourabh:我一定会这样做,但我建议你尝试一下这些变化,并告诉我它是否有效,我会相应地提供一个简要的解释。 – anubhava 2013-04-30 18:48:28

+0

不,它不。另外,当我删除了最后2行的基础htaccess时,它开始发出403禁止请求错误。 – Sourabh 2013-04-30 18:59:37