首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NGINX hashbang重写

NGINX hashbang重写
EN

Stack Overflow用户
提问于 2011-03-21 23:48:11
回答 3查看 14.1K关注 0票数 9

我想知道hashbang的位置或重写nginx指令(#!)urls应该是这样的。基本上,所有非hash-banged的url都通过hashbang路由,就像一个前端控制器。所以:

代码语言:javascript
复制
http://example.com/about/staff

将路由到

代码语言:javascript
复制
http://example.com/#!/about/staff

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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指令来让其他所有东西都命中前端控制器:

代码语言:javascript
复制
 location = / {
  }      

  location = /index.html {
  }      

  location ~ / {
    rewrite ^ /#!$uri redirect;
    break;
  }

不过,要注意这种方法;http://jenitennison.com/blog/node/154将更详细地介绍Gawker的hashbang崩溃以及围绕其使用的其他问题。

票数 11
EN

Stack Overflow用户

发布于 2012-03-20 07:02:18

作为上面的修改,我只对特定的调用做这个重定向,因此不会得到潜在的循环:

代码语言:javascript
复制
location ~ /login|/logout|portfolios|/portfolio/*|/public/* {
  rewrite ^ /#!$uri permanent;
  break;
}

请注意,这在除Safari之外的所有浏览器上都工作得很好。Safari会将你重定向到没有散列的url。

票数 2
EN

Stack Overflow用户

发布于 2014-06-15 20:21:34

最好的方法是使用try_files指令:

代码语言:javascript
复制
location {
    try_files $uri $uri/ /index.html;
}

假设您的index.html文件包含将哈希路由到正确资源的javascript逻辑。uri将保留访问者请求的内容,而当找不到与请求URI匹配的文件时,Nginx只是将请求路由到您的索引文件。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5380108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档