多个.htaccess文件相互冲突

时间:2013-04-30 18:29:50

标签: regex apache .htaccess url-rewriting

我有一个托管多个域的共享托管。在我的托管的根文件夹中存在.htaccess(比如是htaccess1)。 ht1中的代码是:

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

1 个答案:

答案 0 :(得分:2)

主要.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. 添加了必需的选项。
  4. 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. 添加了必需的选项。