使用.htaccess重写多个URL

时间:2013-01-23 17:01:49

标签: .htaccess mod-rewrite

我可以t understand, why URL rewrite doesn工作。

我有脚本,他们获取包含内容的文件。

   if($pg){
        if(file_exists("resources/pages/".$pg.".php")){
            include("resources/pages/".$pg.".php");
        }
        else{
            include("resources/pages/notfound.php");
        }
   }
   else {
        include("resources/pages/home.php");
   }

htaccess,需要重写网址。需要重写类别,页面和语言字符串。

RewriteEngine On
RewriteRule ^([^/]*)/$ /?lang=$1 [NC,OR]
RewriteRule ^([^/]*)/$ /?cat=$1 [NC,OR]
RewriteRule ^([^/]*)/$ /?pg=$1 [NC,OR]
RewriteRule ^([^/]*)/([^/]*)/$ /?lang=$1&pg=$2 [NC,OR]
RewriteRule ^([^/]*)/([^/]*)/$ /?cat=$1&pg=$2 [NC,OR]
RewriteRule ^([^/]*)/([^/]*)/$ /?lang=$1&cat=$2 [NC,OR]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/$ /?lang=$1&cat=$2&pg=$3 [NC,L]

这显示内部服务器错误。如果我只留下第一行

RewriteEngine On
RewriteRule ^([^/]*)/$ /?lang=$1 [L]

只有语言切换工作正常。放第二行时

    RewriteEngine On
RewriteRule ^([^/]*)/$ /?lang=$1 [NC,OR]
RewriteRule ^([^/]*)/$ /?cat=$1 [NC,L]

语言切换工作,但下一个规则不起作用。 :(

1 个答案:

答案 0 :(得分:0)

OR标记仅用于RewriteCond,如果您尝试将其与RewriteRule一起使用,则会给您一个错误。您遇到的问题是,就匹配模式而言,路由到/?lang=/?cat=/?pg=的URI 相同。鉴于此网址:

http://yourdomain.com/blahblah/

使用 $ 1 ,所有3个模式(全部为^([^/]*)/$)都匹配/blahblah/和组blahblah作为后退。但它是一个郎?它是猫吗?或者它是一个页面?您需要唯一地创建模式以匹配3中的每一个,并且它们必须是互斥的。

pg参数只是数字吗?如果是这样,那么路由到它的模式应该是^([0-9]+)/$。 lang变量只有2个字母吗?如果是这样,那么路由到lang的模式应该是^([a-z]{2})/$。请注意,这仅适用于cat参数为1个字符或大于2,或包含数字和符号

无论是什么,你都需要解决它。这就是你看到这种行为的原因。