2010-04-05 6 views
0

То, что я пытаюсь достичь:mod_rewrite и довольно URLs

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

  • Это должно работать, если случайный/текст/здесь 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, он также будет отображаться в категории.php? Lang = English, потому что en/index.php не существует.

То, что я подумал:

зиЬзЬг (% {REQUEST_FILENAME}, 3) будет решить мою проблему (как в настоящее время /ee/index.php буквально отображается в /ee/index.php вместо того, чтобы просто/index.php)

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

ответ

1

Я принимаю это язык код - это то, что делает 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

Это работало нормально, но почему-то, если URL-адрес: http: // localhost/en/sales/subcategory, это аргументы, которые передаются в catagories.php: array (2) {["terms"] => string (35) «sales/subcategory/sales/subcategory» ["lang"] => string (7) "English"} Любые мысли? – Peeter

+0

Добавление L к языковым правилам, похоже, исправило это. – Peeter

+0

@Peeter: флаг [L] пропустит правило «категории». Для URL-адресов, которые не сопоставляются с файлами, компонент конечного пути хранится как информация о пути. Apache может удвоить компонент, пытаясь сохранить информацию о пути. Попробуйте добавить флаг информации о пути отбрасывания («DPI») к языковым правилам (см. Обновленный код). – outis

0

для задачи SubStr, вы можете попробовать absolute paths:

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

о г

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

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

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

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

RewriteRule^(. *)/(script.php | other.php) $ 2 LANG = $ 1 [QSA ]

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

+0

Проблема заменителя начинается RewriteCond% {REQUEST_FILENAME}! -f/RewriteCond% {REQUEST_FILENAME}! -d Он должен перенаправлять categories.php? LANG = Английский IF/а/это/здесь/делает/не/матч/скрипт /. Если я загружу URL-адрес, такой как en/index.php, он также будет отображаться в категории.php? Lang = English, потому что en/index.php не существует. – Peeter

+0

i see i see ...... –

0

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

также

%{QUERY_STRING} 

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

попытаться сделать:

RewriteRule ^en/(.*) $1?lang=English [QSA] 
+0

'[L]' означает, что последнее правило выполняется последним так же, как то, что вы ищете, всегда находится в последнем месте, где вы смотрите. Флаг не изменяет порядок оценки, если это то, что вы имели в виду. – outis

+0

в том, что @Peeter сделал это, языковые правила никогда не будут достигнуты, просты. –