.htaccess重新映射在不同子域上的redirect

我试图让我的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,即不需要特殊&#x7684;HTTP_USER_AGENT条件:

内容在外部服务器上

如果您需要保持浏览器URL的域名部分不变,并且内容位于不同的服务器上,则不再是内部redirect或重新映射 ,而必须使用反向代理 。

虽然在您的示例中使用的[P]标志会导致通过mod_proxy通过代理请求处理请求,但不推荐:

性能警告

使用这个标志将触发mod_proxy的使用,而不处理持续连接。 这意味着如果使用ProxyPassProxyPassMatch设置,代理的性能会更好。 这是因为这个标志触发了使用默认的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 ,否则你将无法使用RewriteCondRewriteRule

如果内容位于外部服务器上,并且无法避免使用[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限制只匹配数字字符。