• nginx的try_files指令


    伪静态

    什么是伪静态,为什么要伪静态

    伪静态是相对真实静态来讲的,通常为了增强搜索引擎的友好度,都将文章内容生成静态页面。但是为了实时的显示一些信息,或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。这就损失了对搜索引擎的友好。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。
    那么为什么要伪静态呢?
    1)如果是一个内容站,有利于seo优化
    2)从一定程度上防止了sql注入,让别人不知道你真实的url地址
    3)在公司上班,领导可能就会要求让你设置伪静态,工作需要。

    伪静态的url长什么样

    比如:

    http://www.a.com/hello/world.html
    http://www.b.com/post/111.html
    http://www.c.com/page/go/1
    

    以上这样的url地址,我们就可以叫伪静态url

    nginx怎么设置伪静态

    nginx配置的一个例子:

    server {
            listen       80;
            server_name  localhost;
            access_log  logs/access.log  main;
            #开启伪静态日志,可以在error_log中查看,方便调试
            rewrite_log on;
            #输出错误日志,错误级别设置为notice
            error_log logs/error.log notice;
    
            root html/test;
            index  index.php index.html;
            location / {
                    try_files $uri $uri/ @aaaaab;
            }
    
            //注意使用@符号,不然不成功
            location @aaaaab {
                    include D:/nginx/html/test/.htaccess;
            }
    
            location ~ .php$ {
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                     include fastcgi_params;
            }
    }
    

    .htaccess清单

    rewrite 语法格式:
    rewrite [regex] [replacement] [flag];
    url正则表达式 替换真实url 标记(last,break)

    实例:
    rewrite ^/article/index.html$ /index.php?process=article&a=index last;

    //注意,这是一行,由于一行写不下,自动换行了
    rewrite ^/article/list/([0-9]+)-([0-9]+)-([0-9]+).html$ 
    /index.php?process=article&a=list&group_id=$1&category_id=$2&p=$3 last;
    rewrite ^/article/detail/([0-9]+).html$   /detail.php?id=$1 last;
    rewrite ^/group/([0-9]+).html$   /group.php?group_id=$1 last;
    

    3,上面的案例虽然小,但是五脏俱全,我们开始一个一个的分析

    try_files $uri $uri/ @aaaaab; 这句话是什么意思?

    try_files从字面上理解就是尝试文件,再结合环境理解就是“尝试读取文件”,那他想读取什么文件呢,
    答:读取静态文件

    $uri 这个是nginx的一个变量,存放着用户访问的地址,
    比如:http://www.xxx.com/index.html, 那么$uri就是 /index.html

    $uri/ 代表访问的是一个目录,比如:http://www.xxx.com/hello/test/ ,那么$uri/就是 /hello/test/

    完整的解释就是:try_files 去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;
    不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。

    比如用户访问这个网地址:http://www.xxx.com/test.html
    try_files首先会判断他是文件,还是一个目录,结果发现他是文件,与第一个参数 $uri变量匹配。
    然后去到网站目录下去查找test.html文件是否存在,如果存在直接读取返回。如果不存在直接跳转到第三个参数,而第三个参数是一个location,而这个location里面配置的就是rewrite规则。

    说到这里大家就明白了,能看懂上面的配置了。
    那有人会问了,还要try_files干什么呀,直接使用rewrite不就可以了吗?
    答:不可以,因为rewrite这个指令把所有请求过来的url地址,都与htaccess文件中的正则地址进行一次匹配,这样的话,静态的url地址也进行了一次匹配,比如http://xxxx.com/aa.png,这个地址是不需要重写的,但是rewrite也进行了一次匹配,这就浪费服务器资源,影响执行效率。而我们真正需要匹配的,其实都是一些动态url地址,如果我说这么多,你还不明白的话,可以打印日志查看。

    include D:/nginx/html/test/.htaccess; 这句就是去加载伪静态文件,把所有的规则写在这里面,注意这里要使用全路径,不然不成功。

    try_files

    语法: try_files file ... uri 或 try_files file ... = code

    默认值: 无
    作用域: server location
    按顺序检查文件是否存在,返回第一个找到的文件。结尾的斜线表示为文件夹 -$uri/。如果所有的文件都找不到,会进行一个内部重定向到最后一个参数。

    例子

    location /
        {
            try_files $uri $uri/ /index.php?$args;
    
        }
    

    参考资料

    Nginx的try_files使用详解
    [Linux] nginx的try_files指令实现隐藏index.php的重写

  • 相关阅读:
    图文详解 Android Binder跨进程通信机制 原理
    支链氨基酸怎么吃
    C#泛型约束
    树状结构 Tree data structure in C#
    wrap ConcurrentDictionary in BlockingCollection
    ConcurrentBag扩展 批量加入
    Dictionary GetOrAdd
    ConcurrentDictionary AddOrUpdate
    object pool
    C# 结构体定义 转换字节数组 z
  • 原文地址:https://www.cnblogs.com/aworkstory/p/13158417.html
Copyright © 2020-2023  润新知