2012-01-19 4 views
2

Я имею следующую структуру сайта:How-to RewriteRule?

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 значения? Я хочу, чтобы структура сайта была проще для вас.

+0

Пути, которые вы упомянули в верхней части ... они физически существуют? –

+0

Спасибо, ваш код работает. – vp1

ответ

3

Попробуйте эти:

# http://site.com 
# note: that this rule changes http://site.com to http://site.com/index.php?... 
# which matches the next rule, the [L] flag should prevent that 
RewriteRule ^$ index.php?lang=en&article_id=index [L] 

# http://site.com/anything except ru,uk,lt 
# http://site.com/anything except ru,uk,lt/ 
RewriteRule ^(?!ru|uk|lt)([^/]+)/?$ index.php?lang=en&article_id=$1 

# http://site.com/ru,uk,lt 
# http://site.com/ru,uk,lt/ 
RewriteRule ^(ru|uk|lt)/?$ index.php?lang=$1&article_id=index 

# http://site.com/ru,uk,lt/anything 
# http://site.com/ru,uk,lt/anything/ 
RewriteRule ^(ru|uk|lt)/([^/]+)/?$ index.php?lang=$1&article_id=$2 

В идеале вы должны решить, разрешить ли URL, оканчивающиеся / или нет. Затем скажите, что вы выбрали , есть a trailing /, 301-перенаправить все запросы без косой черты с URL-адресами. Надеюсь, вы понимаете, что я имею в виду.

1

Вам необходимо реорганизовать ваши правила. Когда вы вводите http://site.com/ru/, Apache видит путь как ru/, который делает в соответствии с вашим первым правилом (ноль или более символов, которые не являются косой чертой, а затем косой чертой; check).

Общее правило при организации правил переписывания состоит в том, чтобы перечислить самые глубокие/наиболее подробные уровни сначала. Поскольку они являются наиболее подробными, у вас будет меньше проблем. Имея менее подробные правила, прежде чем более подробные правила повышают риск правильного запуска цепи до того правила, которое вы действительно хотите вызвать.

Попробуйте просто реверсирования их в файле .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 
+0

Вы были быстрее меня :) +1. – J0HN

+0

, когда я набираю hxxp: //site.com/ru/ (ru - russian, uk - ukrainian, lt - lithuanian) $ _GET [] пишет: «en» и «index.php», мне нужно, чтобы $ _GET записывал " ru "и" index.php "(в качестве основного значения для идентичного содержимого переведенного языка на русском языке) – vp1

+0

http://www.website.com/ru/contact/ пишет ru и контакт (правильно); http://www.website.com/contact/ пишет en и контакт (правильно); http://www.website.com/ru/ пишет en и index.php (не правильно); http://www.website.com/ ничего не пишет (правильно). – vp1