vhost переписать правила в apache - избавиться от поддоменов без перенаправления - PullRequest
1 голос
/ 27 января 2020

Я знаю, что подобные вопросы задавались, но, судя по всему, я не могу заставить его работать.

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

Проще говоря: http://test.example.com/(something) следует интерпретировать как http://example.com/test/(something)

«что-то» необязательно.

Я пробовал делать разные решения, но, кажется, никогда не понял его совершенно правильно - это мой первый опыт с этим.

#   RewriteEngine on 
#   RewriteCond %{HTTP_HOST} ^test.example.com [NC]
#   RewriteRule ^((?!test/).*)$ /test/$1 [L,NC]

#   RewriteCond %{HTTP_HOST} ^test\.example\.com$ [NC] 
#   RewriteRule ^(.*)$  "test%{REQUEST_URI}" 
#   RewriteRule ^(.*)$ test/$1 [L]  

#RewriteEngine on 
#RewriteCond %{HTTP_HOST} ^test.example.com [NC]
#RewriteRule ^(.*)$ example.com/test/%{REQUEST_URI} [P,L,NC]

Важно знать, что example.com/test/something уже существует на другом сервере и не должен использоваться или вызываться.

Я думал о том, чтобы перенаправить test.example.com на новый сервер и затем интерпретировать его на новом сервере как example.com/test с помощью другого vhost (все приложение разрабатывается без поддоменов, но мы собираемся перейти по частям с использованием поддоменов, пока нам не удастся перенести все и восстановить «обычный» путь.

Со временем у нас будут sub1.example.com, sub2.example.com и др. c. Псевдонимы могут сыграть здесь роль, но я не в себе.

Спасибо за помощь!

1 Ответ

0 голосов
/ 27 января 2020

Похоже, вам нужен «обратный прокси», поскольку example.com физически размещен на другом сервере. (Однако в комментариях вы заявляете, что «в будущем» example.com вернется на тот же сервер - в то время вам может не понадобиться «обратный прокси-сервер», если субдомен и основной домен указывают на одну и ту же файловую систему - простая может потребоваться перезапись.)

Для настройки обратного прокси-сервера необходимо убедиться, что mod_proxy и mod_proxy_http (для HTTPS) включены и, возможно, некоторые другие (дополнительные) прокси-модули в зависимости от требований.

Для что вам требуется, когда вы передаете один и тот же URL-путь от источника к цели, вы можете использовать директивы ProxyPass и ProxyPassReverse в контейнере virtualhost для субдомена test.example.com:

ProxyPass / http://example.com/test/
ProxyPassReverse / http://example.com/test/

В качестве альтернативы, если вам нужно более сложное отображение, или если вы хотите / должны сделать это в .htaccess, тогда вы можете использовать mod_rewrite с флагом P (как вы делаете выше):

RewriteEngine On

RewriteCond %{HTTP_HOST} ^test\.example\.com [NC]
RewriteRule ^ http://example.com/test%{REQUEST_URI} [P]

Важно, что вам нужен абсолютный URL (схема + имя хоста) в подстановке RewriteRule (отсутствует в вашем примере).

Если этот хост только согласно epts запрашивает test.example.com, тогда предыдущее условие не требуется.

Обратите внимание, что сервер REQUEST_URI содержит префикс sla sh, поэтому его следует опустить в строке substitution, А поскольку вы используете серверную переменную REQUEST_URI, а не обратную ссылку, вам не нужна группа захвата в шаблоне RewriteRule . ie. ^(.*)$ можно упростить до ^. L не требуется при использовании с P, поскольку подразумевается L.

...