2014-10-08 53 views
0

我想用一些RewriteRule s到变换:预防规则,htaccess的重写规则冲突

这里htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?id=$1 [L] 
RewriteRule ^(.*)/(.*)$ /index.php?id=$2&user=$1 [L] 
</IfModule> 

但似乎最后两个规则不兼容:这种htaccess,我得到一些500 Internal Server Error

如何创建两条规则,使它们不会相互“重叠”?

注:

  • 每个这条规则单独工作

  • 当我使用第二个规则,然后http://example.com/someone/blah =>index.php?id=blah&user=someone作品,但似乎根文件夹不再是//someone/,然后找不到CSS ...在这种情况下如何防止基础文件夹被更改?

回答

2

你有4个问题:

  1. 您的第一条规则(.*)将任何东西转换成/index.php?id=$1
  2. 你的第二个规则不验证,如果一个文件或文件夹是否存在,并可能陷入一个死循环导致500 internal server error
  3. 你的规则你使用相对路径来服务CSS和图像导致它失败,您的网址格式
  4. 的顺序,如domain.com/anything/anything

要解决这个问题,重定向,您可以使用这样的:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteRule ^index\.php$ - [L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^([^/]+)/([^/]+)$ /index.php?id=$2&user=$1 [L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^([^/]+)$ /index.php?id=$1 [L] 
</IfModule> 

因为我已经改变了正则表达式(以([^/]+)这意味着什么不是/),捕捉你想要的数据和命令在这种情况下都不会有问题,因为它会具体匹配:

domain.com/anything 

而且

domain.com/anything/anything 

要解决的CSS和图像您可以使用base TAG来定义你的绝对URL到您的HTML:

<base href="http://domain.com/"> 
+2

+1出色答卷具有很好的解释 – anubhava 2014-10-08 16:50:03

+0

非常感谢你,现在对我来说更加清晰! – Basj 2014-10-08 19:07:04

+0

更一般的(这里没有具体说明),你将如何添加一个后备?即'如果所有列出的条件都不满足,则转到url /' – Basj 2014-10-08 20:04:45