为pushState-URL重写nginx
我正在尝试让 nginx
与基于 pushState
的 URI 处理配合使用,backbone.js
在 Javascript 应用程序中为我管理。
现在使用一级访问 URI,例如。 example.com/users
效果很好,但不适用于两级或更深的 URI,例如 example.com/users/all “http://documentcloud.github.com/backbone/#Router-navigate">主干文档:
例如,如果您的路由为 /documents/100,则您的 Web 服务器 如果浏览器访问该 URL,则必须能够提供该页面 直接
因此,尽管我对 nginx 的重写选项还很不熟悉,但我仍然确信我可以做类似 rewrite ^ /index.html;
的事情来将所有内容重定向到我的 index.html。 html
,但丢失了存储在我需要能够访问的同一服务器上的任何最终静态文件(图像、javascript 和 css)。
那么,我应该如何使用下面显示的当前配置来完成这项工作呢?
server {
listen 80;
server_name example.com;
location / {
root /var/www/example.com;
try_files $uri /index.html;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我最终采用了这个解决方案:
这样,如果找不到文件,至少我仍然会收到正确的 404 错误。
I ended up going with this solution:
This way, at least I still get proper 404 errors if a file isn't found.
这是我对我的应用程序所做的事情。每条以“/”结尾的路由(除了根本身)都将提供
index.html
:您还可以为路由添加前缀 :
,然后为 :
或为每种情况定义一个规则。
Here is what i did to my application. Every route ending with a '/' (except the root it self) will serve
index.html
:You can also prefix your route :
and then :
Or define a rule for each case.
我是这样管理的:
I managed it like this:
对于客户端应用程序路径:
使用:
虽然 @Adam-Waite 的答案 适用于根级别的根和路径,但在位置上下文中使用 if 被视为反模式,在转换 Apache 样式指令时经常出现。请参阅:http://wiki.nginx.org/IfIsEvil。
其他答案没有涵盖我在使用react-router和启用HTML5 PushState的类似React应用程序中的用例的具有目录深度的路由。当在“目录”(例如
example.com/foo/bar/baz/213123
)中加载或刷新路由时,我的index.html文件将引用相对路径处的js文件并解析为<代码>example.com/foo/bar/baz/js/app.js而不是example.com/js/app.js
。对于目录深度超出第一级的情况,例如
/foo/bar/baz
,请注意 @rootfiles 指令中声明的目录顺序:首先需要走最长的可能路径,然后是接下来是较浅的路径/foo/bar
,最后是/foo
。With client side app paths:
Use:
While @Adam-Waite's answer works for the root and paths at the root level, using if within the location context is considered an antipattern, often seen when converting Apache style directives. See: http://wiki.nginx.org/IfIsEvil.
The other answers do not cover routes with directory depth for my use case in a similar React app using react-router and HTML5 pushState enabled. When a route is loaded or refreshed within a "directory" such as
example.com/foo/bar/baz/213123
my index.html file will reference the js file at a relative path and resolve toexample.com/foo/bar/baz/js/app.js
instead ofexample.com/js/app.js
.For cases with directory depth beyond the first level such as
/foo/bar/baz
, note the order of the directories declared in the @rootfiles directive: the longest possible paths need to go first, followed by the next shallower path/foo/bar
and finally/foo
.由于可能存在ajax请求api,因此以下适合这种情况,
Since there may be ajax request api, the following suits for this case,
我尝试使用
try_files $uri /index.html;
但 nginx 在内部重定向到“/index.html”时不断抱怨错误重写或内部重定向循环。
我喜欢 Arthur Xu 提出的解决方案,但通过将所有没有
.
的 URL 重写为/index.html
来简化它。上面将所有不带
.
的 URL 重写为/index.htm'
。I tried with
try_files $uri /index.html;
but nginx kept complaining with errorrewrite or internal redirection cycle while internally redirecting to "/index.html"
.I liked the solution Arthur Xu presented, but simplified it by rewriting all URL't that don't have a
.
to/index.html
.The above rewrites all URL's without
.
in them to/index.htm'
.