V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RiESA
V2EX  ›  问与答

请教一个 Nginx 的问题,有关 404 页面的

  •  
  •   RiESA · 2018-12-16 02:57:04 +08:00 · 1122 次点击
    这是一个创建于 1951 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的网站结构是这种

    //域名 /index.php?title=首页

    然后做了伪静态变成了

    //域名 /w/首页

    然后由于是 wiki 网站,输入不存在的页面时会提示是否新建页面

    //域名 /w/不存在的页面 → 询问是否新建该页面

    这个是用如下这段实现的 location ~* .(js|css|png|jpg|jpeg|gif|ico|mp3|ogg|doc|xls|pdf|ppt|tiff|bmp|docx|xlsx|pptx|ogx|wav|csv|pdf|bmp)$ { try_files $uri /index.php; expires max; log_not_found off; }

    如果是输入

    //域名 /X/首页 → 返回 404 页面,X=非 W 的值

    以上是目前的情况,然后主要目前是直接返回 Nginx 默认的 404 页面有点难看,我希望一个自定义一个 404 页面,同时又不影响新建页面

    但是如果用 error_page 404 /XXX.html;来指定一个页面的话

    //域名 /w/不存在的页面 → 这样也变成返回 404 页面了,写在最后优先级也好像是最高的,像这种情况要怎么处理比较好

    4 条回复    2018-12-16 13:45:33 +08:00
    wly19960911
        1
    wly19960911  
       2018-12-16 09:43:05 +08:00 via Android   ❤️ 2
    个人认为,你这个活是路由的问题,用 Nginx 强制当路由有点不妥。

    我们来分析下,你那个 location 是为了访问不存在的静态文件时,去新建页面。那么好了,静态文件和后端页面的 URL 没什么差别的话,就直接 try files 就可以了,没必要一大串的。另外设置 location 为 /w/

    然后后面那个…其实正则也可以做到 只需要 location ~* /[^w]/ 就可以了 强行去一个页面。
    RiESA
        2
    RiESA  
    OP
       2018-12-16 11:06:54 +08:00
    @wly19960911 #1 受教了,我等会再尝试修改一下
    RiESA
        3
    RiESA  
    OP
       2018-12-16 11:39:05 +08:00
    @wly19960911 #1 成功了,多谢大佬
    wly19960911
        4
    wly19960911  
       2018-12-16 13:45:33 +08:00
    @RiESA #3 我想了一下,我有个地方可以优化下,可以直接用 location / + 'try_files $uri $uri/ /404.php' 就跳到 404 页面去(其实就是模拟空路由的情况)。

    你可以看一下 nginx location 的优先级,通过优先级去排除,正则是最高的优先级,所以正则肯定比 / 优先, 匹配不到你那个 /w 的规则才会进 / 的规则,至于怎么好理解,实现方不方便,我这里只给一个参考意见了。反而用 [^w] 不够好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2812 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:10 · PVG 21:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.