如何重写规则?

时间:2012-01-19 06:54:12

标签: php .htaccess mod-rewrite url-rewriting rewrite

我有以下网站结构:

site.com
\about\
\contact\
\mail\
\ru\
\uk\
\lt\
\ru\o-stranice\
\ru\kontakty\
\ru\pochta\
\uk\storinka\
\uk\zvorotnij-zvyazok\
\uk\skrynka\
\lt\apie\
\lt\kontaktai\
\lt\pastas\

和.htaccess:

RewriteEngine On

# Force English
# for http://www.website.com/
RewriteRule ^([^/]*)/$ index.php?lang=en&article_id=$1

# Other Languages
# for http://www.website.com/ru/
RewriteRule ^(ru|uk|lt)/$ index.php?lang=$1&article_id=index

# Other Languages
# for http://www.website.com/ru/contact/ etc
RewriteRule ^(ru|uk|lt)/([^/]*)/$ /index.php?lang=$1&article_id=$2

变量$article_id是唯一的。

http://site.com
http://site.com/about/
http://site.net/ru/o-stranice/

工作正常,但

http://site.com/ru/
http://site.com/uk
http://site.com/lt

被解释为文件夹名称,所以

echo $_GET ['lang']; //gives en
echo $_GET ['article_id']; //gives "ru". 

如何更正重写规则以显示ru页面和index值?我希望网站结构对您来说更容易。

1 个答案:

答案 0 :(得分:1)

您需要重新组织规则。当您键入http://site.com/ru/时,Apache将路径视为ru/ 匹配您的第一条规则(零个或多个字符不是正斜杠,后跟正斜杠) ; 检查)。

组织重写规则时的一般经验法则是首先列出最深/最详细的级别。由于它们是最详细的,因此您可以减少问题。在更详细的规则之前有更少的详细规则会增加规则在您实际想要触发的规则之前触发链的风险。

尝试在.htaccess文件中简单地将它们全部反转:

RewriteEngine On

# Other Languages
# for http://www.website.com/ru/contact/ etc
RewriteRule ^(ru|uk|lt)/([^/]*)/?$ /index.php?lang=$1&article_id=$2

# Other Languages
# for http://www.website.com/ru/
RewriteRule ^(ru|uk|lt)/?$ index.php?lang=$1&article_id=index

# Force English
# for http://www.website.com/
RewriteRule ^([^/]*)/?$ index.php?lang=en&article_id=$1