nginx:将所有请求发送到单个html页面


156

使用nginx,我想保留url,但是无论如何实际上加载相同的页面。我将使用url和History.getState()在javascript应用中路由请求。看起来应该是一件简单的事情?

location / {
    rewrite (.*) base.html break;
}

可以,但是重定向网址?我仍然需要网址,我只想始终使用同一页面。


6
感谢您提出这个问题,所以答案已经为我准备好了:-)
Lasse Bunk,

Answers:


191

我认为这将为您做到:

location / {
    try_files /base.html =404;
}

1
[emerg] 613#0:“ try_files”指令中的参数数目无效?
十一月

2
好的,试试看:try_files $ uri /base.html;
Alex Howansky 2011年

5
注意-这将首先检查请求的文件,如果不存在,它将提供base.html。因此,请确保您的文档根目录中没有多余的旧文件,否则如果被查询,这些文件将直接提供。
Alex Howansky

22
使用try_files '' /base.html;(空字符串作为的第一个参数try_files)可避免查找名为的文件$uri
davidjb

17
try_files '' /base.html;给了我一个重定向问题和一个内部服务器错误,但是修改了它以try_files '' /base.html =404;解决该问题,如果它可以帮助任何人。
威廉·特雷尔

30

使用try_files对我不起作用-它在我的日志中引起了重写或内部重定向周期错误。

Nginx文档还有一些其他细节:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

所以我最终使用了以下内容:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}

1
try_files '' /base.html =404;(请参见上文)
Marc

这对我有用,但实际上我不需要这个location = /base.html { expires 30s }部分。
maechler's

17

您的原始重写几乎可以正常工作。我不确定为什么要重定向,但我认为您真正想要的只是

rewrite ^ /base.html break;

您应该能够将其放置在某个位置或直接放置在服务器中。


13

这对我有用:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

这使我能够为JavaScript单页应用程序创建一个包含所有内容的URL。如果所有静态文件(如css,字体和javascript构建的静态文件)npm run build 都位于相同的目录中,则会找到它们index.html

如果静态文件由于某种原因位于另一个目录中,则您还需要以下内容:

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}


7

正确的方法是:

location / {
    rewrite (.*) base.html last;
}

使用last将使nginx找到新的合适的方法location根据重写结果块。

try_files 也是解决此问题的一种完全有效的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.