防止规则与htaccess'RewriteRule冲突

时间:2014-10-08 16:25:07

标签: apache .htaccess mod-rewrite

我想使用一些RewriteRule来转换:

以下是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

如何创建两个规则,使它们不会重叠&#34;彼此?

注意:

  • 这两条规则中的每条规则都可以单独使用

  • 当我使用第二条规则时,http://example.com/someone/blah =&gt; index.php?id=blah&user=someone有效,但似乎根文件夹不再是/而是/someone/,然后找不到CSS ...如何防止在这种情况下更改基本文件夹?

1 个答案:

答案 0 :(得分:2)

您有4个问题:

  1. 您的第一条规则(.*)会将任何内容转换为/index.php?id=$1
  2. 您的第二条规则不会验证文件或文件夹是否存在,并且可能会陷入导致500 internal server error的无限循环。
  3. 您的规则的顺序
  4. 您正在使用相对路径来投放CSS和图片,这会导致您的网址格式失败,例如domain.com/anything/anything
  5. 要解决重定向问题,您可以使用:

    <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在HTML中定义绝对网址:

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