Что не так с этим mod_rewrite? - PullRequest
0 голосов
/ 18 мая 2011
RewriteCond %{HTTP_HOST} ^(www.)?domain.com$
RewriteCond %{REQUEST_URI} !^/errors/$
RewriteCond %{REQUEST_URI} !^/content/$
RewriteRule ^(.*)$ /domain/$1/ [L]

Первая и последняя строки работают, они гарантируют, что весь контент из этого домена попадет в этот подкаталог.Два в середине я пытаюсь удержаться от перенаправления.Мне нужно получить доступ к этим 2 папкам из подкаталога, но HTTP_HOST просто отправляет его обратно в ту же папку (ошибка 404).

Я хочу, чтобы оно игнорировало это правило, если ищет domain.com/content/(.*) или domain.com/content/(.*).Обратите внимание, что у меня нет доступа к конфигурации сервера, и .htaccess - единственный способ сделать это.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Я бы предложил сжать ваш код .htaccess следующим образом:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/*(domain|errors|content)/ [NC]
RewriteRule . /domain%{REQUEST_URI}/ [L]
  • . необходимо экранировать как \.
  • [NC] для игнорирования сравнения регистра
  • Отрицательное совпадение URI для errors и content может быть объединено в одно правило с ИЛИ |
  • % {REQUEST_URI} уже имеет ваш исходный URI, поэтому нет необходимости фиксировать этот
  • Добавлено domain в отрицательном соответствии, чтобы избежать бесконечного цикла
2 голосов
/ 18 мая 2011

Регулярные выражения в ваших условиях совпадают только с запросами для /errors/ точно , потому что вы включили якоря начала строки и конца строки (^ и $ ):

RewriteCond %{REQUEST_URI} !^/errors/$

Поскольку вы хотите, чтобы ваше условие соответствовало всем запросам , начиная с /errors/, вам следует избавиться от $ в конце:

RewriteCond %{REQUEST_URI} !^/errors/

То же самое относится и к условию /content/.

...