Я пытаюсь сделать свое приложение 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 - это поддомен.
Is . 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
. Это точно так же, как в примере вашего вопроса.
Если вы можете получить доступ к конфигурации
(или запросить изменение), вы можете добавить туда:
<Location "/test/">
ProxyPass "http://api.example.com/title/test/"
</Location>
Если контент физически находится на том же сервере, но на другом
, самый простой способ - вообще не использовать mod_rewrite или mod_proxy , но mod_alias . Директива Псевдоним
позволяет хранить документы в локальной файловой системе, кроме DocumentRoot
.
Alias "/test" "/path/to/api/title/test"
В этом случае с приложением AngularJS кажется, что вы хотите переназначить URL-адрес только при его посещении поисковыми роботами социальных сетей. В этом случае вам действительно нужно использовать RewriteCond
, а со следующими RewriteRule
вы можете использовать условие из вашего вопроса.
Сначала убедитесь, что у вас есть 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
ограничивает только совпадение для цифровых символов.