我想知道hashbang(#!)网址的位置或重写nginx指令的样子。基本上通过像前端控制器那样的hashbang来路由所有非哈希绑定的url。所以:NGINX hashbang重写
http://example.com/about/staff
将路线
http://example.com/#!/about/staff
我不清楚这里最好的技术是什么?无论是编写一个if语句来检查hashbang的存在,还是只是一个通用的重写过滤所有请求...
我想知道hashbang(#!)网址的位置或重写nginx指令的样子。基本上通过像前端控制器那样的hashbang来路由所有非哈希绑定的url。所以:NGINX hashbang重写
http://example.com/about/staff
将路线
http://example.com/#!/about/staff
我不清楚这里最好的技术是什么?无论是编写一个if语句来检查hashbang的存在,还是只是一个通用的重写过滤所有请求...
GET请求的片段标识符不会/不应该出现在一个错误的客户端中HTTP请求,所以无论Web服务器如何,都不能有重写规则来匹配它们。
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 = /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 the hash。
的最佳途径是使用try_files
指令:
location {
try_files $uri $uri/ /index.html;
}
假设你index.html
文件中包含的JavaScript逻辑路线散列到正确的资源。 URI将保持访问者请求的内容,而Nginx只是在请求URI没有找到真正的匹配文件时将请求路由到索引文件。
你错过了'〜'Wes吗? – 2016-09-04 06:53:44
更好的选择是'try_files'指令。当这个问题得到解答时,或许它不在身边。看到我的回答 – 2014-06-15 12:22:08