Переадресация.htaccess на другой поддомен

Я пытаюсь сделать мое приложение AngularJS доступным для социальных сетей, и я наткнулся на следующую страницу github:

https://github.com/michaelbromley/angular-social-demo

Однако я застрял на .htaccess шаг. Следующий код используется для перенаправления (с помощью переназначения) ботов facebook/twitter/google на другой URL-адрес (в том же домене):

<ifModule mod_rewrite.c>
 RewriteEngine On

# allow social media crawlers to work by redirecting them to a server-rendered static version on the page
RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit/[0-9]|Twitterbot|Pinterest|Google.*snippet)
RewriteRule album/(\d*)$ http://www.michaelbromley.co.uk/experiments/angular-social-demo/server/static-page.php?id=$1 [P]

</ifModule>

То, что я пытаюсь сделать, очень похоже на то, что он делал, однако мой API является поддоменом.

Является .htaccess возможно ли перенаправление перенаправления, когда используется другой поддомен?

Пример:

http://www.example.com/test/123 переназначить на http://api.example.com/title/test/123 и сохранить URL браузера как http://www.example.com/test/123,

1 ответ

Если вам просто нужно http://www.example.com/test/123 переназначить на http://api.example.com/title/test/123 без перенаправления в целом, т.е. без необходимости специального HTTP_USER_AGENT состояние:

Контент на внешнем сервере

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

В то время как [P] Флаг, используемый в вашем примере, приводит к тому, что запрос mod_proxy обрабатывается через прокси-запрос, не рекомендуется:

Предупреждение о производительности

Использование этого флага запускает использование mod_proxy без обработки постоянных соединений. Это означает, что производительность вашего прокси будет лучше, если вы настроите его с ProxyPass или же ProxyPassMatch, Это связано с тем, что этот флаг инициирует использование работника по умолчанию, который не обрабатывает пулы соединений. Избегайте использования этого флага и предпочитайте эти директивы, когда можете.

ProxyPass Директива о том, что Карты удаленных серверов в адресное пространство локального сервера доступны только в конфигурации сервера контекстов, виртуальном хосте и каталоге, но недоступны в .htaccess контекст.

Если у вас нет доступа к конфигурации сервера, вы можете сделать это только с RewriteRule как это разрешено в .htaccess контекст. Это точно так же, как в примере вашего вопроса.

Если вы можете получить доступ к <VirtualHost> конфигурацию (или запросить модификацию), вы можете добавить туда:

<Location "/test/">
    ProxyPass "http://api.example.com/title/test/"
</Location>

Контент на том же сервере

Если контент физически находится на том же сервере, но на другом <VirtualHost> Самый простой способ - это вообще не использовать mod_rewrite или mod_proxy, а mod_alias. Alias Директива позволяет хранить документы в локальной файловой системе, кроме как под DocumentRoot,

Alias "/test" "/path/to/api/title/test"

Если вам нужно только переназначить в случае специальных пользовательских агентов

В этом случае с приложением AngularJS кажется, что вы хотите переназначить URL только тогда, когда его посещают сканеры социальных сетей. В этом случае вам действительно нужно использовать RewriteCond и со следующим RewriteRule s вы можете использовать условие из вашего вопроса.

Сначала убедитесь, что у вас установлен mod_rewrite, иначе вы не сможете использовать RewriteCond а также RewriteRule совсем.

Если контент находится на внешнем сервере, и вы не можете избежать использования [P]:

RewriteRule ^test/(.*)$ http://api.example.com/title/test/$1 [P]

Если вы находитесь в .htaccess контекст, вы не должны совпадать ^test/(.*)$ но текущий каталог:

RewriteRule (.*) http://api.example.com/title/test/$1 [P]

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

Замены обрабатываются как путь файловой системы, только если правило сконфигурировано в контексте сервера (виртуального хоста), а первый компонент пути в замене существует в файловой системе.

RewriteRule ^test/(.*)$ /path/to/api/title/test/$1

Я не пользовалась \d* из вашего примера: метасимвол \d ограничивает совпадение только цифрами.

Другие вопросы по тегам