zoukankan      html  css  js  c++  java
  • nginx配置静态文件服务器的一个特殊需求的探索和分享, nginx处理不同路径返回统一文件,nginx改写,跳转请求.

    最近在做一个前后端分离的个人博客,在做自己博客的时候有个想法,本来是打算用nginx作为静态文件服务器使用,django做后端程序.

    我的前端页面用vue写的,结果用组件用嗨了,发现页面列表和 详情都是通过切换组件实现的,这样很省代码,但是为了实现下面这种效果的时候遇到了问题:

    我要访问url: http://www.liushx.com/artical/123456.html

    返回同一页面(artical.html 或者 detail.html , 具体内容通过api获取, 123456.html就是携带请求数据的),但是要带上123456.html,这个数据是文章详情的id,必须提供.

    那么问题来了,如何实现nginx在处理这个路径的时候去提供我的那个通用文件呢?

    简单说明我的文件结构:

    ht@ht-PC:~$ pwd
    /home/ht
    ht@ht-PC:~$ tree nginx-pages
    nginx-pages
    ├── index.html
    └── pages
        ├── artical.html
        └── detail.html
    
    1 directory, 3 files

    按照现在网上的所有可以找到的方法,我需要把我的url路径设定为 /pages/artical.html

    但是这显然不符合我的需求,我希望的路径是:  /art/123456.html  响应 /pages/artical.html ;   /novel/123456.html  响应 /pages/detail.html ;

    虽然找不到这种类型的资料,但是我相信nginx 是很牛逼的,他们的大佬工程师必定提供这种简单的需求了.

    这种需求在后端实现起来很简单,我感觉通过nginx实现的话,思路八成就是跳转,可惜的是通过 proxy_pass 的方式行不通, nginx会把文件名拼起来,结果就是跳转之后,nginx会去寻找一个 /pages/artical.html123456.html 的神奇文件,然后骄傲的向我报错.

    然后我去查看下官方文档,发现一个有意思的函数 rewrite, re开头的函数....嗯........差不多就是她了!

    官方文档上对rewrite的说明:

    rewrite regex replacement flag

    理解了意思之后立马去尝试, O 了个大 K,跑通了!!!!!

    下面提供关键代码:

    nginx.conf

        server_name localhost;
        root /home/ht/nginx-pages;
        location / {
            index index.html;
            }
    
        location ~* ^/art/d*.html$ {
            rewrite ^(/art/.*)$ /pages/artical.html break; 
            # root /home/ht/nginx-pages;
            # index pages/artical.html;
        }
        location ~* ^/novel/d*.html$ {
            rewrite ^/novel/.*$ /pages/detail.html break;
            # root /home/ht/nginx-pages;
            # index pages/detail.html;
        }

    简单来讲,就是把拿到的路径重新写,换成另一个路径去尝试查找文件,好像nginx提供这个函数是为了容错的,殊途同归嘛,我拿来满足我的需求也好啊.

    这个函数提供的效果简直堪称优秀 !

    因为nginx只是内部改写了这个路径,返回给浏览器的还是用户请求的路径 !

    我的html

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    <h1>index</h1>
    </body>
    </html>

    artical.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>artical</title>
    </head>
    <body>
    <h1>artical</h1>
    </body>
    </html>

    detail.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>detail</title>
    </head>
    <body>
    <h1>detail</h1>
    </body>
    </html>

    运行成功后浏览器的效果:

    嗯嗯,圆满了...

  • 相关阅读:
    ajax基本使用
    ajax
    七个你无法忽视的Git使用技巧
    Git原始笔记
    php session自定义处理
    linux下用phpize给PHP动态添加扩展
    【转】做到这一点,你也可以成为优秀的程序员
    PHP扩展开发-测验成功
    PHP扩展开发--实验成功
    php类似shell脚本的用法
  • 原文地址:https://www.cnblogs.com/haiton/p/10875938.html
Copyright © 2011-2022 走看看