Назад | Перейти на главную страницу

Перенаправление на абсолютный URL-адрес в .htaccess возвращает неправильное имя хоста в OpenShift

Я создаю веб-сайт на OpenShift. Он работает под Apache 2.2.15, но у меня нет доступа к корню Apache или журналам, поэтому я пытаюсь имитировать виртуальные каталоги в файле .htaccess в корне моего сайта. Большинство из них работает хорошо, но есть проблема с перенаправлением, которую я не могу понять.

Сайт устроен так:

корень приложения / репо - корень сайта, где находится .htaccess
корень приложения / репо / домен_пример
приложение-корень / репо / домен_пример / основной - основной сайт (WordPress)

В WordPress мой блог находится по адресу www.example.com/blog, но до перехода на WordPress у меня было несколько статей в поддомене blogs.example.com. Для поддержки ссылок я настроил команды перенаправления в .htaccess. Они отлично работали у моего старого провайдера виртуального хостинга. Они даже отлично работали в OpenShift перед Я добавил www.example.com в качестве псевдонима OpenShift. Однако после добавления псевдонима я не могу заставить .htaccess возвращать www. если исходное имя хоста начинается с блогов.

Из Апача Документация по перенаправлению:

Новый 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-адреса.

Те же результаты, если я завершу логику НЕ с помощью $:

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]

Нет бесконечного цикла, но перенаправление по-прежнему идет на 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 что бы я ни старался.

Если ваш [старый] - 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-porary