2种不同的.htaccess规则

时间:2013-01-17 17:58:54

标签: php .htaccess

我正在尝试为我的网站设置两个不同的.htaccess规则,但我仍然无法找到正确的解决方案。

我想在website.com/almost-everything上路由一切 - 这对我很有帮助。而且,我想补充一下这条路线:website.com/car/car_id - 这里有麻烦,我不知道如何设置它。

以下是我的尝试:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?skill=$1 [L,QSA]
RewriteRule ^car/(.*)$ ./index.php?id=car&car_id=$1 # the wrong rule - the page with website.com/car/car_id just doesn't display the correct file

你可以用第二条规则来帮助我吗?

3 个答案:

答案 0 :(得分:1)

重写从顶部到底部逐行工作。

检查初始条件(文件不存在)后,它会遇到您的第一条规则。

它说,如果URL是什么,请修改它。它还有两个选项:

  • “QSA”表示追加查询字符串
  • “L”表示这是最后一条规则,因此请停止处理

由于这个“L”,它会停止处理,并且在此规则之后没有任何反应。

解决此问题:

  • 更改规则的顺序,因为“car /”更具体
  • 还将L和QSA标志添加到“car /”规则中。

所以:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^car/(.*)$ ./index.php?id=car&car_id=$1 [L,QSA]
RewriteRule ^(.*)$ index.php?skill=$1 [L,QSA]

答案 1 :(得分:1)

而不是

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?skill=$1 [L,QSA]
    RewriteRule ^car/(.*)$ ./index.php?id=car&car_id=$1 # the wrong rule - the page with website.com/car/car_id just doesn't display the correct file

我会这样做

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]   ## passthru + last rule because the file or directory exists. And stop all other rewrites. This will also help your css and images work properly.

RewriteRule ^car/(.*)$  /index\.php?id=car&car_id=$1 [L,QSA]

RewriteRule ^(.*)$  /index\.php?skill=$1 [L,QSA]

P.S。我用空行分隔我的规则,所以很清楚有多少。以上显示了3个不同的规则。

答案 2 :(得分:0)

更好的解决方案是将您的所有请求重定向到index.php,然后解析$_SERVER['REQUEST_URI']。那么你就需要为每一个新的未来改变htaccess。

在apache中你可以这样做>

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]

在php中,您可以手动填写$_GET,这样看起来就像您的旧请求......

$f = explode('/', substr($_SERVER['REQUEST_URI'], 1));
switch ($f[0]) {
    case 'car' :
        $_GET['id'] = $f[0];
        $_GET['car_id'] = $f[1];
        break;
    default:
        $_GET['skill'] = $f[0];
}

# your old code, that reads info from $_GET

更好的做法是上课,这将照顾网址。