我想知道针对哈希bang(#!)URL的位置或重写nginx指令会是什么样子。基本上通过将所有非哈希bang的URL路由到类似于前置控制器的哈希bang中。因此:
http://example.com/about/staff
会路由到
http://example.com/#!/about/staff
我不确定这里最好的技术是什么?是编写if语句来检查hashbang的存在,还是只编写一个通用的重写来过滤所有请求...
我想知道针对哈希bang(#!)URL的位置或重写nginx指令会是什么样子。基本上通过将所有非哈希bang的URL路由到类似于前置控制器的哈希bang中。因此:
http://example.com/about/staff
http://example.com/#!/about/staff
在HTTP请求中,片段标识符的GET不会/不应该(一些有缺陷的客户端可能会发送它们),因此您无法使用重写规则来匹配它们,而不管是哪个Web服务器。
如果您尝试使初始请求重定向到/#!而不是提供根目录索引,那么您将得到“太多重定向”错误,因为客户端将返回请求/(请记住它不会在其请求中发送#)。对于索引文档,您需要使用JavaScript进行此操作。
底线是它在GET请求中不可用于服务器端。即使curl已经被修补过了,不再发送它。
但您可以使用nginx位置指令使其他所有内容都命中前置控制器:
location = / {
}
location = /index.html {
}
location ~ / {
rewrite ^ /#!$uri redirect;
break;
}
请注意这种方法的潜在问题;http://jenitennison.com/blog/node/154详细介绍了Gawker上的哈希标记问题以及其他与其使用相关的问题。
location ~ /login|/logout|portfolios|/portfolio/*|/public/* {
rewrite ^ /#!$uri permanent;
break;
}
最佳方法是使用 try_files
指令:
location {
try_files $uri $uri/ /index.html;
}
index.html
文件包含将哈希路由到正确资源的JavaScript逻辑。URI将保持访问者请求的内容,而当找不到真正匹配请求URI的文件时,Nginx只是将请求路由到您的索引文件。
try_files
指令。也许在回答这个问题时它还不存在。请参考我的回答。 - Wes Johnson