![Перенаправление на абсолютный URL в .htaccess возвращает неправильное имя хоста на OpenShift](https://rvso.com/image/658339/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D0%B0%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9%20URL%20%D0%B2%20.htaccess%20%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%85%D0%BE%D1%81%D1%82%D0%B0%20%D0%BD%D0%B0%20OpenShift.png)
Я создаю веб-сайт наOpenShift. Он работает под Apache 2.2.15, но у меня нет доступа к корню Apache или журналам, поэтому я пытаюсь эмулировать виртуальные каталоги в файле .htaccess в корне моего сайта. Большая часть работает хорошо, но есть проблема с перенаправлением, которую я не могу понять.
Сайт имеет следующую структуру:
приложение-корень/репо- корень сайта, где находится .htaccess
приложение-корень/репозиторий/пример_домена
app-root/repo/пример_домена/главный- основной веб-сайт (WordPress)
В WordPress мой блог находится по адресу www.example.com/blog, но до перехода на WordPress у меня было несколько статей в поддомене blogs.example.com. Чтобы сохранить ссылки, я настроил команды Redirect в .htaccess. Они отлично работали на моем старом хостинг-провайдере. Они отлично работали даже на OpenShiftдоЯ добавил www.example.com как псевдоним OpenShift. Однако после добавления псевдонима я не могу заставить .htaccess возвращать www., если исходное имя хоста начинается с blogs.
От АпачиПеренаправление документации:
Новый URL должен быть абсолютным URL, начинающимся со схемы и имени хоста. В Apache HTTP Server 2.2.6 и более поздних версиях также может использоваться URL-путь, начинающийся со слеша, в этом случае будут добавлены схема и имя хоста текущего сервера. Тогда любой запрос, начинающийся с URL-пути, вернет клиенту запрос на перенаправление в местонахождение целевого URL.
Чего я ожидаю:Если я укажу абсолютный URL в качестве цели, перенаправление должно вернуть этот URL клиенту. Затем клиент может повторно выдать свой запрос, используя правильный URL.
Что происходит:Перенаправление происходит (я вижу 302 в Firebug), но оно указывает на исходный домен, а не на целевой. Это похоже на то, что он делает вторую часть (используя «схему и имя хоста текущего сервера»), хотя я указал абсолютный URL.
Вот отрывок из моего .htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L]
# blogs.example.com redirects
redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/
С этим .htaccess, когда я перехожу наhttp://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspxи просматриваю ответ в Firebug, вижу, что 302-й редирект будетhttp://blogs.example.com/blog/2010/05/check-windows-time-settings/. Но его не существует, поэтому я получаю ошибку 404 Not Found.Почему он переходит на блоги, когда я говорю ему перейти на www.?
Мне было интересно, переопределяет ли псевдоним OpenShift Redirect, но согласно документации Redirect:
Директивы перенаправления имеют приоритет над директивами Alias и ScriptAlias, независимо от их порядка в файле конфигурации.
Я также попробовал добавить явную ловушку и переписать путь, начинающийся с blogs.example.com/blog/ (который, по-видимому, и возвращает перенаправление):
RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Я все еще получаю 404 Not Found с этим. Фактически, даже самый простой URL,http://blogs.example.com/blog/, выдает 404.
Как мне заставить работать перенаправления в этой ситуации?
Обновление 27 мая 2015 г. № 1
Попробовал использовать логику «не» в блоке Rewrite:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Это приводит к бесконечному циклу перенаправлений, 20 перенаправлений, прежде чем он сдастся. Каждое перенаправление по-прежнему начинается сhttp://blogs.example.comзначит, что-то все еще мешает RewriteRule записать «www» в начале URL.
Тот же результат, если я завершу логику NOT с помощью $
:
RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]
Обновление 27 мая 2015 г. № 2
@Quasidynamic указал, что %(HTTP_HOST) включает только имя хоста и ничего после. Поэтому я попробовал это, чтобы выбрать только URL, начинающиеся с www.example.com/blog
:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
Бесконечного цикла нет, но Redirect все равно переходит на blogs.
, а затем Rewrite не может отправить его на www.
.
Обновление 28 мая 2015 г.
По просьбе @Quasidynamic, пробуем этот блок:
RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]
Как и ожидалось, когда я перехожу на blogs.example.com
, он перенаправляется на blogs.example.com/blog/
. Поскольку это все еще соответствует RewriteCond, он затем перенаправляется на blogs.example.com/blog/blog/
. До бесконечности. Он никогда, никогда не переходит на www.example.com
, что является корневой проблемой, с которой я столкнулся с самого начала: как только я добавил blogs.example.com
поддомен OpenShift, я больше не могу использовать .htaccess для перенаправления на , www.example.com
что бы я ни пытался сделать.
решение1
Если ваш [old] — blogs.example.com, а [target] — www.example.com/blog:
RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]
Вы были близки, но вы пытались сопоставить /blog с запросом, которого там не будет, он есть только на [целевом] сайте, насколько я понимаю вашу ситуацию.
Используйте код 301 - "Статус 301 означает, что ресурс (страница) перемещен навсегда в новое местоположение. Клиент/браузер не должен пытаться запрашивать исходное местоположение, а должен использовать новое местоположение с этого момента." из
https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary