2011-03-21 133 views
8

我想知道hashbang(#!)网址的位置或重写nginx指令的样子。基本上通过像前端控制器那样的hashbang来路由所有非哈希绑定的url。所以:NGINX hashbang重写

http://example.com/about/staff 

将路线

http://example.com/#!/about/staff 

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

回答

11

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崩溃和其他使用问题。

+0

更好的选择是'try_files'指令。当这个问题得到解答时,或许它不在身边。看到我的回答 – 2014-06-15 12:22:08

2

由于上述的修改,我只能这样做重定向特定的电话,正是如此得到任何潜在循环后卫:

location ~ /login|/logout|portfolios|/portfolio/*|/public/* { 
    rewrite^/#!$uri permanent; 
    break; 
} 

请注意,这工作得很好,除了上Safari的浏览器所有。 Safari会将您重定向到网址sans the hash。

-1

的最佳途径是使用try_files指令:

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

假设你index.html文件中包含的JavaScript逻辑路线散列到正确的资源。 URI将保持访问者请求的内容,而Nginx只是在请求URI没有找到真正的匹配文件时将请求路由到索引文件。

+0

你错过了'〜'Wes吗? – 2016-09-04 06:53:44