zoukankan      html  css  js  c++  java
  • Nginx 重写

    Rewrite 概述

    什么是 Rewrite

    改写请求的 URL,将用户请求的 URL 重新定位到一个新的 URL

    Rewrite 作用

    ①.Rewrite 使网站更加安全,隐藏了具体的文件路径和文件名

    ②.Rewrite 提高了用户体验,如输入老域名,可以跳转到新域名;加过 SSL 证书后,可以从 HTTP 跳转到 HTTPS

    ③.Rewrite 可以实现 URL 的伪静态,优化 SEO(Search Engine Optimization),动态请求的 URL 也会被搜索引擎收录

    如何使用 Rewrite

    使用 Rewrete 需要使用 ngx_http_rewrite_module 模块(官方文档)。

    Flag Description
    redirect 返回 302 临时重定向,浏览器缓存和搜索引擎会记载(收录)原域名,不影响 SEO 权重
    permanent 返回 301 永久重定向,浏览器缓存和搜索引擎会记载(收录)跳转后的域名,影响 SEO 权重
    break 停止处理当前 location 匹配规则,不再请求,可用于切换维护页面的场景
    last 停止处理当前 location 匹配规则,重新请求重写的 URL,寻找匹配的 location
    # Rewrite 语法
    Syntax:		rewrite regex replacement [flag];
    Default:	—
    Context:	server, location, if
    # Return 语法
    Syntax:	return code [text];
    return code URL;
    return URL;
    Default:	—
    Context:	server, location, if
    # If 语法
    Syntax:		if (condition) { ... }
    Default:	—
    Context:	server, location
    # 配置日志
    Syntax:		rewrite_log on | off;
    Default:	rewrite_log off;
    Context:	http, server, location, if
    
    
    # 配置 Rewrite 日志
    [root@web01 ~]# vi /etc/nginx/nginx.conf 
    http{
    ...
        rewrite_log on;
        error_log /var/log/nginx/rewrite_error.log notice;
    ...
    }
    
    # Rewrite 配置,区分 last 和 break
    [root@web01 ~]# cat /etc/nginx/conf.d/rewrite.conf 
    server {
            listen 80;
            server_name rewrite.wqh.com;
            root /website;
    
            location ~ ^/break {
                    rewrite ^/break /test/ break;
            }
            location ~ ^/last {
                    rewrite ^/last /test/ last;
            }
            location /test/ {
                    default_type application/json;
                    return 200 "ok";
            }
    }
    

    Break 与 Last 的区别:
    Break 匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
    Last 匹配到规则,会重新发起请求匹配符合条件的 server 与 location 规则 。

    Break 请求:
    1、请求 rewrite.wqh.com/break
    2、首先,会去查找本地的 /website/test/index.html;
    3、如果找到了,则返回 /website/test/index.html 的内容;-----------------以上为相同点,以下为不同点
    4、如果没找到该目录则报错 404,如果找到该目录没找到对应的文件则 403

    Last 请求:
    1、请求 rewrite.wqh.com/last
    2、首先,会去查找本地的 /website/test/index.html;
    3、如果找到了,则返回 /website/test/index.html 的内容;-----------------以上为相同点,以下为不同点
    4、如果没找到,会对当前 server 重新的发起一次请求,rewrite.wqh.com/test/
    5、如果有 location 匹配上,则直接返回该location的内容;
    6、如果也没有 location 匹配,再返回 404

    所以,在请求匹配了 /break 和 /last 的规则时,都会默认寻找请求目录 /test 是否存在,若不存在,理论上都应该返回 404,
    但是实际上请求 /last 的时候,是可以再次匹配 location 得到结果返回的(类似 continue 只是跳出本次循环;last 标记只是跳出本次 location 规则,然后重新发起请求,匹配符合条件的 location 规则)
    请求 /break 的时候,不可以再次匹配 location,只会按 URL 路径寻找其目录或索引文件是否存在,所以 /test 目录不存在,就会返回 404(类似 break 跳出整个循环,break 标记不再重新发起请求,也不会匹配符合条件的server 与 location 规则)

    Rewite 实现伪静态

    安装 Discuz

    应用服务器 Nginx 配置:

    # 编辑 nginx 子配置文件
    [root@web01 ~]# cat /etc/nginx/conf.d/discuz.wqh.com.conf 
    server {
    	listen 80;
    	server_name discuz.wqh.com;
    	root /website/discuz/upload;
    	index index.php;
    	location ~ .php$ {
    		fastcgi_pass 127.0.0.1:9000;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		include fastcgi_params;
    	}
    }
    
    # 下载安装包,部署到站点目录
    [root@web01 ~]# cd /website/discuz
    [root@web01 discuz]# ll
    drwxr-xr-x  2 www www  102 Jul 27  2017 readme
    drwxr-xr-x 12 www www 4096 Jul 27  2017 upload
    drwxr-xr-x  4 www www   72 Jul 27  2017 utility
    
    # 重启服务,配置 Windows 本地域名解析
    

    数据库服务器 MariaDB 配置:

    # 创建一个 discuz 数据库
    [root@db01 ~]# mysql -p123
    MariaDB [(none)]> create database discuz;
    MariaDB [(none)]> grant all on discuz.* to dc_user@'%' identified by '123456';
    

    打开浏览器安装:

    伪静态 URL

    为了 SEO(Search Engine Optimization,搜索引擎优化),当客户端发起动态请求时,我们需要使用伪静态技术,将请求的 URL 地址去掉参数,修改成 .html 的静态文件 。

    如果某个动态请求的 URL是这样的:http://discuz.wqh.com/forum.php?mod=viewthread&tid=1&extra=page%3D1,那么这个页面几乎就不会被搜索引擎收录,因为搜索引擎无法加上 URL 中的参数,如下图:

    所以,如果想更容易的被搜索引擎收录,需要将动态请求 URL 伪装成静态请求 URL,进入到 Discuz 后台管理界面,修改 SEO 设置,开启 URL 静态化:

    点击右上角 查看当前的 Rewrite 规则,可以看到需要写到 nginx 配置文件中的规则:

    # 编写 nginx 子配置文件,将上图中的 Rewrite规则 写到 location /{} 中
    [root@web01 conf.d]# cat discuz.wqh.com.conf 
    server {
    	listen 80;
    	server_name discuz.wqh.com;
    	root /website/discuz/upload;
    	index index.php;
    
    	location / {
    	rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
    	rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
    	rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
    	rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
    	rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
    	rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
    	rewrite ^([^.]*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
    	rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/archiver/index.php?action=$2&value=$3 last;
    	rewrite ^([^.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_-]+).html$ $1/plugin.php?id=$2:$3 last;
    		if (!-e $request_filename) {
    			return 404;
    		}
    	}
    
    	location ~ .php$ {
    		fastcgi_pass 127.0.0.1:9000;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		include fastcgi_params;
    	}
    }
    

  • 相关阅读:
    AtCoder Grand Contest 033
    Luogu P6620 [省选联考 2020 A 卷] 组合数问题
    Luogu P6631 [ZJOI2020] 序列
    Luogu P6630 [ZJOI2020] 传统艺能
    Luogu P6633 [ZJOI2020] 抽卡
    Luogu P6623 [省选联考 2020 A 卷] 树
    AtCoder Grand Contest 034
    Luogu P5445 [APIO2019] 路灯
    LOJ #6059. 「2017 山东一轮集训 Day1」Sum
    Luogu P3721 [AH2017/HNOI2017]单旋
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13034112.html
Copyright © 2011-2022 走看看