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

pri*_*ing 143 javascript history nginx

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

location / {
    rewrite (.*) base.html break;
}
Run Code Online (Sandbox Code Playgroud)

工作,但重定向网址?我仍然需要网址,我只想总是使用相同的页面.

Ale*_*sky 180

我想这会为你做到:

location / {
    try_files /base.html =404;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用``try_files''/ base.html;``(空字符串作为``try_files``的第一个参数)避免查找名为``$ uri``的文件. (22认同)
  • `try_files''/ base.html;`给了我一个重定向问题和一个内部服务器错误,但修改为'try_files''/ base.html = 404;`修复了它,如果它可以帮助任何人. (16认同)
  • 注意 - 这将首先检查所请求的文件,如果不存在,它将提供base.html.因此,请确保您的文档根目录中没有旧的额外文件,或者如果查询它们将直接提供. (5认同)
  • [紧急] 613#0:“try_files”指令中的参数数量无效? (2认同)
  • 好的,试试这个: try_files $uri /base.html; (2认同)

Kev*_*ard 26

使用刚刚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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用.接受的答案没有 (4认同)
  • 为什么这样做而不是接受的答案? (3认同)
  • `try_files '' /base.html =404;`(见上文) (2认同)

kol*_*ack 17

你的原始重写应该几乎可以工作.我不确定它为什么会重定向,但我认为你真正想要的只是

rewrite ^ /base.html break;
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ian 11

这对我有用:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}
Run Code Online (Sandbox Code Playgroud)

这使我能够为javascript单页应用创建一个包罗万象的URL.npm run build 如果它们位于同一目录中,将找到所有静态文件,如css,fonts和javascript index.html.

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

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}
Run Code Online (Sandbox Code Playgroud)


Eth*_*one 7

正确的方法是:

location / {
    rewrite (.*) base.html last;
}
Run Code Online (Sandbox Code Playgroud)

使用last将使nginx location根据重写结果找到一个新的合适块.

try_files 对于这个问题,这也是一种非常有效的方法.


Abh*_*hek 7

这为我工作:

location / {
    try_files $uri $uri/ /base.html;
}
Run Code Online (Sandbox Code Playgroud)