我想知道hashbang的位置或重写nginx指令(#!)urls应该是这样的。基本上,所有非hash-banged的url都通过hashbang路由,就像一个前端控制器。所以:
http://example.com/about/staff将路由到
http://example.com/#!/about/staff我不清楚这里最好的技术是什么?无论是编写if语句来检查是否存在hashbang,还是只编写一个通用重写来过滤所有请求……
发布于 2011-03-30 18:09:47
片段标识符的GET不会/不应该(一些有buggy的客户端可能会发送它们)出现在HTTP请求中,因此您不能使用重写规则来匹配它们,而不管send服务器是什么。
The HTTP engine cannot make any assumptions about it. The server is not even given it.
如果您尝试发出初始请求/重定向到/#!而不是提供根索引,最终会出现“重定向次数太多”错误,因为客户机会再次请求/(请记住,它不会将#与请求一起发送)。对于索引文档,您需要使用javascript来完成此操作。
底线是它在GET请求的服务器端不可用。甚至curl has been patched也不再发送了。
你可以使用nginx location指令来让其他所有东西都命中前端控制器:
location = / {
}
location = /index.html {
}
location ~ / {
rewrite ^ /#!$uri redirect;
break;
}不过,要注意这种方法;http://jenitennison.com/blog/node/154将更详细地介绍Gawker的hashbang崩溃以及围绕其使用的其他问题。
发布于 2012-03-20 07:02:18
作为上面的修改,我只对特定的调用做这个重定向,因此不会得到潜在的循环:
location ~ /login|/logout|portfolios|/portfolio/*|/public/* {
rewrite ^ /#!$uri permanent;
break;
}请注意,这在除Safari之外的所有浏览器上都工作得很好。Safari会将你重定向到没有散列的url。
发布于 2014-06-15 20:21:34
最好的方法是使用try_files指令:
location {
try_files $uri $uri/ /index.html;
}假设您的index.html文件包含将哈希路由到正确资源的javascript逻辑。uri将保留访问者请求的内容,而当找不到与请求URI匹配的文件时,Nginx只是将请求路由到您的索引文件。
https://stackoverflow.com/questions/5380108
复制相似问题