Я пытаюсь сделать свое приложение 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
.
Если тебе просто нужно 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
Директива который Сопоставляет удаленные серверы с URL-пространством локального сервера доступно только в контекстах конфигурация сервера, виртуальный хост и каталог, но недоступно в .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
ограничивает совпадение только цифровыми символами.