0

0

Nginx怎么解决history模式下页面刷新404问题

WBOY

WBOY

发布时间:2023-05-13 14:40:11

|

5123人浏览过

|

来源于亿速云

转载

    前置知识

    • 单页应用(spa - single page application)
      只在第一次加载页面时,返回唯一的html页面和它的公共静态资源,后续的页面跳转都不会从服务端拿html文件。(hash和history路由实现浏览器url变化而不刷新页面)

    • hash路由
      例子:www.baidu.com/#/home, 原本hash是用来结合锚点实现页面试图的控制,当#后面的值发生改变时不会重新请求页面,主要通过window的onhashchange方法来实现。

    • history路由
      相比于hash路由,最直观的变化就是路由中没有#,通过调用window.history对象上的一系列方法来实现页面的无刷新跳转(pushState、replaceState)。

    history模式下,因为url改变了,此时如果手动刷新页面,浏览器认为是请求一个新的页面(发起新的Http请求),而新的页面是不存在的(后端未配置的话),导致404。

    先简述一下在浏览器上输入IP或域名后发生的事情(有点面试题的味道了嗷????),按下回车之后,浏览器发出的http去请求html文件,在通过一系列的转发和寻址解析后,被目标IP所在服务器上的80端口(默认)接收,这个时候,问题来了哈,服务器的80接口拿到Http请求后,它不知道要去返回什么,这个时候就需要Nginx进行静态资源代理,告诉服务器返回什么静态文件

    Nginx

    对于一般的项目部署,我们需要处理nginx.conf配置文件
    该文件,需要知道的如下

       ....
       # http 是指令块,针对http网络传输的一些指令配置
       http {
           #文件扩展名与文件类型映射表 
           include mime.types;
           #设置客户端与服务端请求的超时时间
           keepalive_timeout  65;
           # 开启压缩功能,目的:提高传输效率,节省带宽 
           gzip on
           server {
              #监听端口
              listen   80;
              #服务命名,最好就是用这个服务器的域名命名
              server_name localhost;
              #指令块,配置外部访问资源和实际资源的对应关系
              location /{
                  root /usr/blog; #表示静态资源所在的目录
                  index  index.html index.htm; #访问这个路径对应的默认静态资源文件或者网页
              }
           }
       }

    location

    语法

       location [=|~|~*|^~|@] uri { ... } 
       location @name { ... }
    • =:表示精确匹配

    • ~:表示区分大小写正则匹配

    • ~*:表示不区分大小写正则匹配

      零一万物开放平台
      零一万物开放平台

      零一万物大模型开放平台

      下载
    • ^~:表示 URI 以某个常规字符串开头

    • !~:表示区分大小写正则不匹配

    • !~*:表示不区分大小写正则不匹配

    • /:通用匹配,任何请求都会匹配到

    常用匹配规则

       # 将所有请求直接转发给服务器的9090端口
        location = / {
          proxy_pass http://127.0.0.1:9090/;
        }
        # 目录匹配 
        location ^~ /static/ { 
            root /webroot/static/;
        } 
        # 后缀匹配 
        location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { 
            root /webroot/res/; 
        }
        # 将/account/开始的请求转发给Account服务器
        location /account/ {
            proxy_pass http://127.0.0.1:8080/
        }
        # 将/order/开始的请求转发给Order服务器
        location /order/ {
            proxy_pass http://127.0.0.1:9090/
        }

    root 与 alias

    两者区别在于 nginx 如何解释 location 后面的 url

    [root]语法:root path默认值:root html配置段:http、server、location、if处理结果:root 路径+ location 路径

    [alias]
    语法:alias path
    配置段:location
    处理结果:使用 alias 路径替换 location 路径

       # 返回/www/root/html/t/a.html的文件
       location ^~ /t/ { 
           root /www/root/html/;
       } 
       # 返回/www/root/html/new_t/a.html的文件 
       # 把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。 
       location ^~ /t/ { 
           alias /www/root/html/new_t/; 
       }

    解决刷新后出现404的问题

    由上面的知识可以知道,刷新后,浏览器根据当前的url去请求html文件,但是SPA只有一个html文件,所以需要在nginx.conf的对应location里配置一行代码 try_files $uri $uri/ /index.html; 告诉nginx如果按顺序检查文件是否存在,若不存在则重定向到index.html文件

    相关专题

    更多
    C++ 高级模板编程与元编程
    C++ 高级模板编程与元编程

    本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

    10

    2026.01.23

    php远程文件教程合集
    php远程文件教程合集

    本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

    29

    2026.01.22

    PHP后端开发相关内容汇总
    PHP后端开发相关内容汇总

    本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

    21

    2026.01.22

    php会话教程合集
    php会话教程合集

    本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

    21

    2026.01.22

    宝塔PHP8.4相关教程汇总
    宝塔PHP8.4相关教程汇总

    本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

    13

    2026.01.22

    PHP特殊符号教程合集
    PHP特殊符号教程合集

    本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

    11

    2026.01.22

    PHP探针相关教程合集
    PHP探针相关教程合集

    本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

    8

    2026.01.22

    菜鸟裹裹入口以及教程汇总
    菜鸟裹裹入口以及教程汇总

    本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

    55

    2026.01.22

    Golang 性能分析与pprof调优实战
    Golang 性能分析与pprof调优实战

    本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

    9

    2026.01.22

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    进程与SOCKET
    进程与SOCKET

    共6课时 | 0.3万人学习

    nginx浅谈
    nginx浅谈

    共15课时 | 0.8万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号