Как использовать .htaccess для перенаправления на URL-адрес, содержащий HTTP_HOST?

Проблема

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


person Jon Cram    schedule 16.09.2008    source источник


Ответы (7)


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

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

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

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

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

person Olivier Pons    schedule 05.04.2012

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

RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]
person Sean Carpenter    schedule 16.09.2008

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

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

//Change default directory page
DirectoryIndex 
person jornare    schedule 04.04.2012

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

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

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

person Nicholas    schedule 16.09.2008
comment
Это предполагает, что переписанный домен всегда будет www.domain2.com. В вопросе прямо указано, что это не так. - person Sean Carpenter; 26.06.2009

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

RedirectMatch 301 ^/terms$ /articles/terms/

Производит:

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

or:

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.

person Colonel Sponsz    schedule 16.09.2008

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

Redirect temp /terms /articles/terms/

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

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

person Jim    schedule 16.09.2008

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

Alias /terms /www/public/articles/terms/
person Jaykul    schedule 16.09.2008
comment
Псевдоним неоптимален, потому что он не выполняет перенаправление. Это означает, что у вас есть два разных ресурса без канонического URI, что вызывает различные проблемы, например. менее эффективное кеширование, некорректно работающая история браузера и т. д. - person Jim; 16.09.2008