Как использовать .htaccess для перенаправления на URL-адрес, содержащий HTTP_HOST? - PullRequest
3 голосов
/ 16 сентября 2008

Задача

Мне нужно перенаправить некоторые короткие удобные URL-адреса на более длинные фактические URL-адреса. Данный сайт использует набор поддоменов для идентификации набора версий для разработки или живых версий.

Мне бы хотелось, чтобы URL, на который перенаправлялись определенные запросы, включал HTTP_HOST, чтобы мне не нужно было создавать собственный файл .htaccess для каждого хоста.

Пример для конкретного хоста (вырезано из файла .htaccess)

Redirect /terms http://support.dev01.example.com/articles/terms/

Этот пример отлично работает для версии разработки, запущенной на dev01.example.com. Если я использую ту же строку в главном файле .htaccess для версии для разработчиков, работающей под dev02.example.com, я попаду в неправильное место.

Идеальное правило (не уверен в правильности синтаксиса)

Redirect /terms http://support.{HTTP_HOST}/articles/terms/

Это правило не работает и служит лишь примером того, чего я хотел бы достичь. Затем я мог бы использовать одно и то же правило для разных хостов и получить правильный результат.

Ответы

  • Можно ли это сделать с помощью mod_alias или требуется более сложный mod_rewrite?
  • Как этого добиться, используя mod_alias или mod_rewrite? Я бы предпочел решение mod_alias, если это возможно.

Разъяснения

Я не останавливаюсь на одном сервере. Я хотел бы:

Мне бы хотелось иметь возможность использовать одно и то же правило в файле .htaccess как на example.com, так и на dev.example.com. В этой ситуации мне нужно было бы ссылаться на HTTP_HOST как на переменную, а не указывать ее буквально в URL-адресе, на который перенаправляются запросы.

Я исследую параметр HTTP_HOST, как было предложено, но надеялся на рабочий пример.

Ответы [ 7 ]

3 голосов
/ 05 апреля 2012

Странно, что никто не сделал фактический рабочий ответ (смеется):

RewriteCond %{HTTP_HOST} support\.(([^\.]+))\.example\.com
RewriteRule ^/terms http://support.%1/article/terms [NC,QSA,R]

Чтобы помочь вам быстрее выполнять работу, мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

Этот инструмент используется, когда вы хотите проверить URL-адрес и посмотреть, действительны ли они или нет.

0 голосов
/ 04 апреля 2012

Если я правильно понял ваш вопрос, вы хотите, чтобы 301 перенаправил (скажите браузеру перейти на другой URL). Если мое решение не подходит для вас, попробуйте этот инструмент: http://www.htaccessredirect.net/index.php и выясните, что работает для вас.

//301 Redirect Entire Directory
RedirectMatch 301 /terms(.*) /articles/terms/$1

//Change default directory page
DirectoryIndex 
0 голосов
/ 16 сентября 2008

Я думаю, вы захотите захватить значение HTTP_HOST, а затем использовать его в правиле перезаписи:

RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]
0 голосов
/ 16 сентября 2008

Похоже, что вам действительно нужен просто псевдоним?

Alias /terms /www/public/articles/terms/
0 голосов
/ 16 сентября 2008

Вам не нужно включать эту информацию. Просто укажите URI относительно корня.

Redirect temp /terms /articles/terms/

Это объясняется в документации mod_alias :

Новый URL-адрес должен быть абсолютным URL-адресом, начинающимся со схемы и имени хоста, но также можно использовать URL-путь, начинающийся с косой черты, в этом случае будут добавлены схема и имя хоста текущего сервера.

0 голосов
/ 16 сентября 2008

Если вы остаетесь на том же сервере, то добавление этого в ваш .htaccess будет работать независимо от сервера:

RedirectMatch 301 ^/terms$ /articles/terms/

Производит:

http://example.com/terms -> http://example.com/articles/terms

или

http://test.example.com/terms -> http://test.example.com/articles/terms

Очевидно, вам нужно настроить соответствие REGEX и тому подобное, чтобы убедиться, что оно справляется с тем, что вы собираетесь на него бросить. То же самое касается 301, вы можете захотеть 302, если вы не хотите, чтобы браузеры кэшировали перенаправление.

Если вы хотите:

http://example.com/terms -> http://server02.example.com/articles/terms

Тогда вам нужно будет использовать параметр HTTP_HOST.

0 голосов
/ 16 сентября 2008

Согласно этому списку (http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/) это должно работать

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain2.com/$1

Обратите внимание, что у меня нет способа проверить это, поэтому его следует воспринимать как указатель в правильном направлении, а не как явный ответ.

...