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

StackOverflow https://stackoverflow.com/questions/72458

Вопрос

Проблема

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

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

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

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

Этот пример отлично работает для версии для разработки, запущенной по адресу dev01.example.com.Если я использую ту же строку в файле main .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, как было предложено, но надеялся на рабочий пример.

Это было полезно?

Решение

Странно, что никто не сделал этого на самом деле. работающий ответ (лол):

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-адреса и посмотреть, действительны они или нет.

Другие советы

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

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

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

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

//Change default directory page
DirectoryIndex 

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

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

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

Если вы остаетесь на том же сервере, то добавление этого в ваш файл .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

Очевидно, вам нужно будет настроить соответствие РЕГУЛЯРНОМУ выражению и тому подобное, чтобы убедиться, что оно справляется с тем, что вы собираетесь в него добавить.То же самое касается 301, вам может понадобиться 302, если вы не хотите, чтобы браузеры кэшировали перенаправление.

Если ты хочешь:

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

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

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

Redirect temp /terms /articles/terms/

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

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

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

Alias /terms /www/public/articles/terms/
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top