NGINX hashbang 重写

9

我想知道针对哈希bang(#!)URL的位置或重写nginx指令会是什么样子。基本上通过将所有非哈希bang的URL路由到类似于前置控制器的哈希bang中。因此:

http://example.com/about/staff

会路由到
http://example.com/#!/about/staff

我不确定这里最好的技术是什么?是编写if语句来检查hashbang的存在,还是只编写一个通用的重写来过滤所有请求...
3个回答

11

在HTTP请求中,片段标识符的GET不会/不应该(一些有缺陷的客户端可能会发送它们),因此您无法使用重写规则来匹配它们,而不管是哪个Web服务器。

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

如果您尝试使初始请求重定向到/#!而不是提供根目录索引,那么您将得到“太多重定向”错误,因为客户端将返回请求/(请记住它不会在其请求中发送#)。对于索引文档,您需要使用JavaScript进行此操作。

底线是它在GET请求中不可用于服务器端。即使curl已经被修补过了,不再发送它。

但您可以使用nginx位置指令使其他所有内容都命中前置控制器:

 location = / {
  }      

  location = /index.html {
  }      

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

请注意这种方法的潜在问题;http://jenitennison.com/blog/node/154详细介绍了Gawker上的哈希标记问题以及其他与其使用相关的问题。


更好的选择是使用 try_files 指令。也许在回答这个问题时它还不存在。请参考我的回答。 - Wes Johnson

2
作为上述修改的一部分,我仅对特定调用进行重定向,从而避免潜在的循环回路。
location ~ /login|/logout|portfolios|/portfolio/*|/public/* {
  rewrite ^ /#!$uri permanent;
  break;
}

请注意,这在除Safari之外的所有浏览器上都可以正常工作。Safari会将您重定向到不带哈希的URL。

-1

最佳方法是使用 try_files 指令:

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

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

你是不是忘了加上“~”符号,Wes? - Keith John Hutchison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接