我正在尝试使我的 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
指示那将远程服务器映射到本地服务器 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 时重新映射 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
将匹配限制为仅数字字符。