mod_rewrite и красивые URL - PullRequest
       12

mod_rewrite и красивые URL

0 голосов
/ 05 апреля 2010

Чего я пытаюсь достичь:

1) http://localhost/en/script.php?param1=random отображается на http://localhost/script.php?param1=random&language=English

  • Это должно работать всегда.

2) http://localhost/en/random/text/here будет сопоставлен с http://localhost/categories.php?term=random/text/here

  • Это должно работать, если random / text / здесь 404

Что у меня есть на данный момент:

RewriteEngine on
RewriteCond substr(%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^en/(.+)$ categories.php?lang=English&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ee/(.+)$ categories.php?lang=Estonian&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^fi/(.+)$ categories.php?lang=Finnish&terms=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ru/(.+)$ categories.php?lang=Russian&terms=$1 [L]

RewriteRule ^en/(.*) $1?lang=English [QSA]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA]

В чем проблема:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 

Предполагается, что он будет перенаправлен на category.php? Lang = английский IF / en / this / here / does / not / match / a / script. Если я загружу URL-адрес, такой как en / index.php, он также будет сопоставлен с category.php? Lang = English, потому что en / index.php не существует.

Что я подумал:

substr (% {REQUEST_FILENAME}, 3) исправит мою проблему (поскольку в настоящее время /ee/index.php буквально сопоставляется с /ee/index.php вместо просто /index.php)

К сожалению, я не смог найти способ манипулирования строками: /

Ответы [ 3 ]

1 голос
/ 05 апреля 2010

Я так понимаю, код языка - это то, что делает URL-адрес несуществующим файлом. Переключите два шага, сначала переместив код языка в строку запроса. Это также имеет дополнительное преимущество, заключающееся в упрощении шага ключевого слова для одного RewriteRule, поскольку им больше не нужно выполнять две вещи одновременно.

RewriteRule ^en/(.*) $1?lang=English [QSA,DPI]
RewriteRule ^ee/(.*) $1?lang=Estonian [QSA,DPI]
RewriteRule ^ru/(.*) $1?lang=Russian [QSA,DPI]
RewriteRule ^fi/(.*) $1?lang=Finnish [QSA,DPI]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ categories.php?terms=$1 [L,QSA]
0 голосов
/ 05 апреля 2010

проблема в том, что вы используете флаг L. Это означает, что правило будет выполнено последним.

также

%{QUERY_STRING}

не требуется, добавьте QSA, и вы получите все параметры, добавленные в конец URL

попробуйте сделать:

RewriteRule ^en/(.*) $1?lang=English [QSA]
0 голосов
/ 05 апреля 2010

При возникновении проблемы вы можете попробовать absolute paths:

RewriteRule ^en/(.*) /$1?lang=English&%{QUERY_STRING}

или

RewriteRule ^en/(.*) http:/localhost/$1?lang=English&%{QUERY_STRING}

Кроме того, я мог бы придираться, но было бы легче, если бы вы провели оценку языка в базе PHP на языковых кодах, в 404 несуществующих языках и использовали

RewriteRule ^(.*?)/(.*) $2?lang=$1&%{QUERY_STRING}

Редактировать: в зависимости от того, сколько у вас есть скриптов, вы не можете сделать что-то вроде:

RewriteRule ^ (. *?) / (Script.php | other.php) $ 2? Lang = $ 1 [QSA]

= есть файлы списка каналов, которые доступны?

...