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

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

Я создаю веб-сайт на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

Связанный контент