我试图让我的AngularJS应用程序可以通过社交networking发现,我碰到以下github页面:
https://github.com/michaelbromley/angular-social-demo
但是我被卡在.htaccess
步骤。 下面的代码被用于将facebook / twitter / google botredirect(使用重新映射)到不同的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而不需要redirect,即不需要特殊的HTTP_USER_AGENT
条件:
如果您需要保持浏览器URL的域名部分不变,并且内容位于不同的服务器上,则不再是内部redirect或重新映射 ,而必须使用反向代理 。
虽然在您的示例中使用的[P]
标志会导致通过mod_proxy通过代理请求处理请求,但不推荐:
性能警告
使用这个标志将触发mod_proxy的使用,而不处理持续连接。 这意味着如果使用
ProxyPass
或ProxyPassMatch
设置,代理的性能会更好。 这是因为这个标志触发了使用默认的worker,它不处理连接池。 避免使用这个标志,并尽可能地select那些指令。
将远程服务器映射到本地服务器URL空间的ProxyPass
指令仅在上下文服务器configuration , 虚拟主机和目录中 可用 ,但在.htaccess
上下文中不可用 。
如果您无权访问服务器configuration,则只能使用RewriteRule
执行此操作,因为它在.htaccess
上下文中是允许的。 这正如你的问题的例子。
如果你可以访问<VirtualHost>
configuration(或者要求修改),你可以在那里添加:
<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
你可以使用你的问题的条件。
首先确保你已经安装了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]
如果内容在同一台服务器上的不同path上 ,则可以使用文件系统path进行replace,但不能在.htaccess
完成:
在服务器(虚拟主机)上下文中configuration规则时,replace仅被视为文件系统path,并且replace中的path的第一个组件存在于文件系统中。
RewriteRule ^test/(.*)$ /path/to/api/title/test/$1
我没有在你的例子中使用\d*
: 元字符 \d
限制只匹配数字字符。