Что не так с этим mod_rewrite?

#.htaccess #mod-rewrite

#.htaccess #мод-перезапись

Вопрос:

 RewriteCond %{HTTP_HOST} ^(www.)?domain.com$
RewriteCond %{REQUEST_URI} !^/errors/$
RewriteCond %{REQUEST_URI} !^/content/$
RewriteRule ^(.*)$ /domain/$1/ [L]
  

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

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

Ответ №1:

Я бы предложил сжать ваш код .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 может быть объединено в одном правиле с OR |
  • У%{REQUEST_URI} уже есть ваш исходный URI, поэтому нет необходимости фиксировать это
  • Добавлено domain при отрицательном совпадении, чтобы избежать бесконечного цикла

Комментарии:

1. Вы, сэр, Бог. Решил мою недельную проблему менее чем за 5 минут. Большое вам спасибо! 🙂

2. Я столкнулся с препятствием. Я хочу использовать символические ссылки из /domain/ папки. Итак, давайте предположим… http://domain.com/forum/1-general/ что на самом деле http://domain.com/index.php?area=forumamp;id=1 так и есть. В настоящее время я использую этот mod_rewrite в .htaccess в /domain/ папке: RewriteRule ^([a-zA-Z]*)/([0-9*])-([a-zA-Z0-9_-]*)/ index.php?module=$1amp;id=$2 [L] . Это работает, но отрицательное совпадение в root .htaccess не оказывает никакого эффекта. Есть какие-нибудь идеи?

3. Можете ли вы попробовать: RewriteCond %{REQUEST_URI} !^/*domain/(errors|content)/ [NC] для вашего .htaccess внутри /domain/ . Если у вас все еще есть проблемы, пожалуйста, предоставьте свой root и /domain/ содержимое .htaccess, и я постараюсь помочь вам с этим.

4. Это не сработало. Вот код .htaccess для / : gyazo.com/e37fe1a563a4f510f30a9fac53471d1d.png и вот код .htaccess для /domain/ : gyazo.com/b9d11b5c4328da16c65f39be08784621.png

5. У меня есть одно сомнение. Если вы используете изображение, подобное этому: <img src="/content/background.png"> и у вас есть папка содержимого под root, тогда зачем вам вообще нужно создавать символическую ссылку? Потому что изображение будет отображаться даже без этого. Также, когда что-то не работает, можете ли вы показать мне соответствующие сообщения apache об ошибках.log для этого. Обычно это очень полезная информация.

Ответ №2:

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

 RewriteCond %{REQUEST_URI} !^/errors/$
  

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

 RewriteCond %{REQUEST_URI} !^/errors/
  

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

Комментарии:

1. Это то, что я ищу, но это не дает желаемого эффекта.