NGINX hashbang重写

我想知道什么位置或重写nbash的指令hashbang(#!)url看起来像。 基本上通过hashbang像前端控制器路由所有非哈希砰的URL。 所以:

http://example.com/about/staff 

将路由到

 http://example.com/#!/about/staff 

我不清楚这里最好的技术是什么? 无论是写一个if语句来检查hashbang的存在,还是只是一个通用的重写来过滤所有的请求…

GET的片段标识符不会/不应该(一些有问题的客户端可能会发送它们)出现在HTTP请求中,所以无论Web服务器如何,都不能有重写规则来匹配它们。

HTTP引擎不能对此做任何假设。 服务器甚至没有给它。

如果您尝试将/重定向到/#的初始请求! 而不是服务根索引,最终会出现“重定向太多”的错误,因为客户端会再次请求(记住它不会发送#请求)。 你需要使用javascript来做这个,而不是索引文件

底线是GET请求中服务器端不可用。 即使卷曲已修补不再发送。

你可以使用nginx的位置指令来让所有其他的东西碰到前端控制器:

  location = / { } location = /index.html { } location ~ / { rewrite ^ /#!$uri redirect; break; } 

小心这种方法,但; http://jenitennison.com/blog/node/154更详细地介绍了Gawker的hashbang崩溃和其他使用问题。

作为上面的一个修改,我只对特定的调用进行重定向,因此没有潜在的循环返回:

 location ~ /login|/logout|portfolios|/portfolio/*|/public/* { rewrite ^ /#!$uri permanent; break; } 

请注意,除Safari之外的所有浏览器都可以正常工作。 Safari会将您重定向到网址sans哈希。

最好的路线是使用try_files指令:

 location { try_files $uri $uri/ /index.html; } 

假设您的index.html文件包含将哈希路由到正确的资源的JavaScript逻辑。 URI将保持访问者请求的内容,而Nginx只是简单地将请求路由到索引文件,如果找不到请求URI的真实匹配文件。