htaccess чистый URL - PullRequest
       1

htaccess чистый URL

0 голосов
/ 20 июля 2011

Я хочу изменить свой URL-адрес на:

www.xxxx.com/en/ -> index.php?lang=en
www.xxxx.com/news -> index.php?mod=news

Я использую этот код, но он не работает:

RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1

RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 

var_dump($_GET) результат:

array(2) { ["mod"]=> string(9) "index.php" ["PHPSESSID"]=> string(32) "e7a5fc683653b7eea47a52dfc64cd687" }

Я также использую тестер htaccess (http://htaccess.madewithlove.be/), и все было в порядке!(

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Вы захватываете index.php.Игнорировать существующие файлы и каталоги и прекратить обработку правил с помощью [L]

RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1 [L]

# Don't rewrite index.php or other existing file/dir
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 [L]
1 голос
/ 20 июля 2011

Оба правила проходят и поэтому применяются.Первый переписывает /en/ в /index.php?lang=en.Затем второе правило проходит и переписывается в /index.php?mod=index.php.

. Используйте параметр [L], чтобы остановить обработку после прохождения данного правила:

RewriteCond %{REQUEST_URI} ^/(pe|en|fr|sp|ar)/$ 
RewriteRule ^([^/]*)/$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_URI} !^/(pe|en|fr|sp|ar)$ 
RewriteRule ^([^/]*)$ index.php?mod=$1 [L]
0 голосов
/ 21 июля 2011

Это прекрасно работает для меня:

RewriteRule ^(pe|en|fr|sp|ar)/$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?!(?:pe|en|fr|sp|ar)/)([^/]*)$ index.php?mod=$1 [L]
  1. Вы обязательно должны использовать флаг [L] в таких ситуациях

  2. Я избавился от RewriteCond в первом правиле - шаблон достаточно прост и не требует наличия отдельного условия (что означает, что в моей реализации необходимо выполнить 2 совпадения вместо 1).

  3. Во втором правиле используйте %{REQUEST_FILENAME}, чтобы проверить, не является ли запрошенный ресурс (оригинальный или уже переписанный) ненастоящим файлом / папкой, и только затем переписать. Это предотвратит двойное переписывание, с которым вы сталкиваетесь.

  4. Я также избавился от RewriteCond здесь, поскольку правило не слишком сложное (его сложнее читать, особенно если ваши навыки регулярных выражений невелики, но это работает). Это также отличает мой ответ от уже предоставленного:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...