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