Переадресация.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 ограничивает совпадение только цифрами.