2016-08-22 3 views
2

Я читал везде, что шаблон подстановки в Apache, Rewrite Engine работает, как ожидалось для регулярных выражений, так что я пробовал:

.htaccess:
RewriteRule (.*) index.php?route=$1

Но для запроса на domain.com/some/url в ГЭТ вар маршрута я index.php вместо some/url

В HTTP вар REDIRECT_QUERY_STRING я получаю route=some/url
Но в QUERY_STRING я route=index.php

Что может быть не так?

PS: $0 также возвращает index.php
Если я использую RewriteRule . index.php?route=$1, я получаю маршрут = i, независимо от запроса URL.

ответ

2

$1 работает, как ожидалось, но проблема в том, ваше использование этой модели:

(.*) 

, который соответствует любому. Правило вашего переписывания на самом деле циклически и работает дважды, потому что у вас нет RewriteCond для циклического цикла.

  1. Сначала он работает для URI = some/url и URI становится index.php в то время как $1 становится some/url
  2. Второй раз он работает для URI = index.php и $1 становится index.php

Вы можете использовать это правило, чтобы исправить поведение:

# If the request is not for a valid directory 
RewriteCond %{REQUEST_FILENAME} !-d 
# If the request is not for a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) index.php?route=$1 [L,QSA] 

ИЛИ если вы хотите переписать существующие файлы и каталоги index.php затем использовать:

RewriteRule ^((?!index\.php$).*)$ index.php?route=$1 [L,QSA,NC] 

Это будет переписать все, кроме index.php к index.php.

+0

Спасибо! Я получаю использование для [L, QSA], но как насчет RewriteConds? они для этой конкретной проблемы? Поскольку я действительно хочу, чтобы даже если запросы соответствовали существующим именам файлов или каталогов, они по-прежнему будут направлены на index.php – Petruza

+0

ok в моем обновленном ответе, чтобы переписать все файлы/каталоги. – anubhava

+1

Спасибо, но только добавление флагов заставило его работать, даже без исключения 'index.php' либо с Условиями, либо с регулярным выражением – Petruza

 Смежные вопросы

  • Нет связанных вопросов^_^