五、rewrite伪静态实例

1.搭建discuz论坛

# 创建站点目录
[root@web01 ~]# mkdir /code/discuz
[root@web01 code]# rz Discuz_X3.3_SC_GBK.zip
[root@web01 code]# unzip Discuz_X3.3_SC_GBK.zip -d /code/discuz/

# 授权站点目录
[root@web01 discuz]# chown -R www.www /code/discuz/

# 配置discuz论坛的配置文件
[root@web01 conf.d]# cp wordpress.conf discuz.linux.com.conf
[root@web01 conf.d]# vim discuz.linux.com.conf
server {
    listen 80;
    server_name discuz.linux.com;
    
    location / {
        root /code/discuz/upload;
        index index.php;
    }   
    
    location ~* \.php$ {
        root /code/discuz/upload;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# 配置hosts访问

1.选全新安装Discuz! (含UCenter Server)

UCenter Server是网站的用户管理中心,您可以通过UCenter Server实现用户的一站式注册、登录、退出以及社区其他数据的交互。

伪静态配置到nginx配置文件 nginx伪静态规则_linux

 管理员账号admin 密码 admin

# 创建数据库
[root@db01 ~]# mysql -uroot -padmin123
MariaDB [(none)]> create database discuz charset utf8;
MariaDB [(none)]> grant all on discuz.* to discuz@'172.16.1.%' identified by '123456';

3.点下一步,完成站点安装

4.点直接访问站点

伪静态配置到nginx配置文件 nginx伪静态规则_linux_02

2.配置hosts, 访问论坛,分表帖子

# 查看帖子地址
http://discuz.linux.com/forum.php?mod=viewthread&tid=1&extra=page%3D1

3.配置rewrite伪静态

点页面右上角管理中心,点击上方全局,点击左侧SEO设置
在URL静态化中,把可用全都打钩,Rewrite兼容性选是

伪静态配置到nginx配置文件 nginx伪静态规则_html_03

 点击提交,点击查看当前的 Rewrite规则 (其他项目也是开发给)

伪静态配置到nginx配置文件 nginx伪静态规则_linux_04

# 把Nginx Web Server中的规则写入nginx配置中
[root@web01 conf.d]# vim /etc/nginx/conf.d/discuz.linux.com.conf
server {
    listen 80;
    server_name discuz.linux.com;

    location / {
        root /code/discuz/upload;
        index index.php;
        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 ^([^\.]*)/archiver/(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) {    # -e判断文件或者目录是否存在
            return 404;
        }
    }

    location ~* \.php$ {
        root /code/discuz/upload;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
-------------------------------------------
# 重启nginx
[root@web01 conf.d]# systemctl restart nginx

# 访问帖子变为下方地址
http://discuz.linux.com/thread-1-1-1.html

# ^([^\.]*) 不以点开头的所有内容(加中括号表示不以点开头),表示域名
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;

# 通过跳转可以看出跳转的地址如下
http://discuz.linux.com/forum.php?mod=viewthread&tid=1&extra=page%3D1&page=1

 

六、rewrite规则补充

1.rewrite匹配的优先级

1.先执行server模块的rewrite指令
2.其次执行location匹配规则
3.最后执行location里面的rewrite

server {
    listen 80;
    server_name rw.linux.com;
    rewrite ^(.*)$ http://www.jingdong.com;
    
    location /test {
        rewrite ^(.*)$ http://www.mumusir.com;
    }
    
    location =/ {
        rewrite ^(.*)$ http://www.baidu.com;
    }
}
# 先走server的rewrite,如果没有走=/(级别高),如果没有再走/test

 

2.rewrite全局变量

$server_name    #当前用户请求的域名
server {
    listen 80;
    server_name rw.linux.com;
    root /code;
    rewrite ^(.*)$ http://$server_name;    # $server_name就是rw.linux.com
}

$request_filename    #请求的文件路径和名字(带着网站站点目录的路径和文件 /code/images/1.jpg)
$request_uri        # 请求的文件路径和名字(不带网站站点目录的路径和文件 /images/1.jpg)

server {
    listen 80;
    server_name rw.linux.com;
    root /code;
    rewrite ^(.*)$ http://$server_name$request_uri;
}

# 很久很久以前,网站优化
server {
    listen 80;
    server_name www.baidu.com baidu.com;
    root /code;
    if ($http_host = baidu.com) {
        rewrite (.*) http://www.baidu.com;
    }
}
# 对上方改进的实际写法
server {
    listen 80;
    server_name baidu.com;
    rewrite (.*) http://www.baidu.com;
}
server {
    listen 80;
    server_name www.baidu.com;
    root /code;
}

# 现在直接在阿里云域名解析中设置标签@,如下图

伪静态配置到nginx配置文件 nginx伪静态规则_html_05

 

3.rewrite可以开启日志

# NGINX主配置文件,错误日志级别改成notice (跳转属于notice级别)
[root@web01 ~]# vim /etc/nginx/nginx.conf
error_log  /var/log/nginx/error.log notice;

# http层开启rewrite日志
rewrite_log on;

# 重启nginx后可以通过   /var/log/nginx/error.log 查看

 

七、HTTPS

1.HTTPS基本概述

为什么需要使用HTTPS,因为HTTP不安全,当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。

那么我们在实现https时,需要了解ssl协议,但我们现在使用的更多的是TLS加密协议。

那么TLS是怎么保证明文信息被加密的呢?在OSI七层模型中,应用层是http协议,那么在应用层协议之下,我们的表示层,是ssl协议所发挥作用的一层,他通过(握手、交换秘钥、告警、加密)等方式,是应用层http协议没有感知的情况下做到了数据的安全加密

伪静态配置到nginx配置文件 nginx伪静态规则_伪静态配置到nginx配置文件_06

2.HTTPS证书下发流程

我们首先需要申请证书,先去登记机构进行身份登记,我是谁,我是干嘛的,我想做什么,然后登记机构再通过CSR发给CA, CA中心通过后会生成一堆公钥和私钥,公钥会在CA证书链中保存,公钥和私钥证书我们拿到后,会将其部署在WEB服务器上
1.当浏览器访问我们的https站点时,他会去请求我们的证书
2.Nginx这样的web服务器会将我们的公钥证书发给浏览器
3.浏览器会去验证我们的证书是否合法有效
4.CA机构会将过期的证书放置在CRL服务器,CRL服务的验证效率是非常差的,所以CA又推出了OCSP响应程序,OCSP响应程序可以查询指定的一个证书是否过期,所以浏览器可以直接查询OSCP响应程序,但OSCP响应程序性能还不是很高
5.Nginx会有一个OCSP的开关,当我们开启后,Nginx会主动上OCSP上查询,这样大量的客户端直接从Nginx获取证书是否有效

伪静态配置到nginx配置文件 nginx伪静态规则_html_07

3.模拟网站劫持

伪静态配置到nginx配置文件 nginx伪静态规则_html_08

1)配置被劫持网站

# 配置一个我的网站
[root@web01 conf.d]# vim jc.linux.com.conf
server {
    listen 80;
    server_name jc.linux.com;
    root /code/jc;
    index index.html;
    charset utf8;
}

# 配置一个我的页面
[root@web01 conf.d]# mkdir /code/jc
[root@web01 conf.d]# vim /code/jc/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是一个标签</title>
</head>
<body>
<article>
    <header>
        <h1>我是linhaoda</h1>
        <p>创建时间:<time pubdate="pubdate">2020-03-04</time></p>
    </header>
    <p>
        <b>Aticle</b>很怕被别人劫持,好他*的紧张...
    </p>
    <footer>
        <p><small>最终解释权归我所有!</small></p>
    </footer>
</article>
</body>
</html>

# 访问测试配置hosts(报错可能是hosts文件中一行域名添加超过上限,换行再写就行了)

2) 配置劫持网站的网站

# lb01机器
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# vim jc.linux.com.conf
server {
    listen 80;
    server_name jc.linux.com;
    location / {
        proxy_pass http://10.0.0.7;
        proxy_set_header HOST $http_host;
        sub_filter '我是一个标签' '我是一个正经网站';
        sub_filter '很怕被别人劫持' '第一次劫持别人网站';
        sub_filter '最终解释权归我所有' '彪悍的人生不需要解释';
    }
}
# 切换hosts配置

4.证书类型介绍

伪静态配置到nginx配置文件 nginx伪静态规则_html_09

1)购买证书选择

1.保护一个域名  www.mumusir.com
2.保护多个域名  www.  test.  cdn.  image.  class.
3.保护通配符域名  *.mumusir.com

2)HTTPS证书注意事项

1.https不支持续费,证书到期需要重新申请并进行替换
2.https不支持上级域名解析,如 test.m.haoda.com
3.https显示绿色,说明整个网站的url都是https的
    https显示黄色,因为网站代码中包含http的不安全链接
    https显示红色,那么证书是假的或者证书过期。

5.配置单台机器HTTPS证书

1)检查nginx能否使用证书

[root@web01 conf.d]# nginx -V
--with-http_ssl_module    # 必须要有这个模块

2)创建存放证书目录

[root@web01 conf.d]# mkdir /etc/nginx/ssl-key
[root@web01 conf.d]# cd /etc/nginx/ssl-key/

3)生成证书(不用记, 这里为自己做假证, 企业里不使用这种方式)

[root@web01 ssl-key]# openssl genrsa -idea -out server.key 2048  #(生成key文件)
Generating RSA private key, 2048 bit long modulus
...........+++
...............................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:    # 输入密码,这里输入 123456
Verifying - Enter pass phrase for server.key:    # 再次输入密码验证

# 下方为申请的假证所需要验证人的身份信息  (生成crt文件)
[root@web01 ssl-key]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
Generating a 2048 bit RSA private key
.........+++
................................+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:zg    # 输入国家
State or Province Name (full name) []:shanghai
Locality Name (eg, city) [Default City]:pd
Organization Name (eg, company) [Default Company Ltd]:oldboy
Organizational Unit Name (eg, section) []:oldboy
Common Name (eg, your name or your server's hostname) []:maliao
Email Address []:123@qq.com

# 命令参数说明
# req --> 用于创建新的证书
# new --> 表示创建的是新证书
# x509 --> 表示定义证书的格式为标准格式 
# key --> 表示调用的私钥文件信息
# out --> 表示输出证书文件信息
# days --> 表示证书的有效期

[root@web01 ssl-key]# ll    (这里是成对的)
total 8
-rw-r--r-- 1 root root 1375 Oct  9 23:45 server.crt
-rw-r--r-- 1 root root 1708 Oct  9 23:45 server.key

4)nginx证书配置语法

# 启动ssl功能
Syntax:    ssl on | off;
Default:    ssl off;    # 默认是关闭的
Context:    http, server

# 证书文件(crt文件)
Syntax:    ssl_certificate file;
Default:    —
Context:    http, server

# 私钥文件(key文件)
Syntax:    ssl_certificate_key file;
Default:    —
Context:    http, server

5)配置nginx证书

[root@web01 ssl-key]# vim /etc/nginx/conf.d/s.linux.com.conf
server {
    #listen 443;    # https是443端口
    listen 443 ssl; # 新版本采用这种,等于listen 443和ssl on(老版本,会警告但无影响)
    server_name s.linux.com;
    #ssl on;    # 开启ssl
    ssl_certificate /etc/nginx/ssl-key/server.crt;#如果是相对路径,会从/etc/nginx找,但不推荐
    ssl_certificate_key /etc/nginx/ssl-key/server.key;
    
    location / {
        root /code/https;
        index index.html;
    }
}

server {  # 写这一块,输入地址的时候就不用前面特意加上https了,会自动跳转
  listen 80;
  server_name s.linux.com;
  #rewrite (.*) https://$server_name$1 redirect;
  return 302 https://$server_name$request_uri;  # 等效于rewrite
}

# 重启nginx
[root@web01 ssl-key]# systemctl restart nginx

# 配置站点
[root@web01 ssl-key]# mkdir /code/https
[root@web01 ssl-key]# echo "test https" > /code/https/index.html

6)配置hosts访问测试

https://s.linux.com/
浏览器会提示不安全,点击证书查看

伪静态配置到nginx配置文件 nginx伪静态规则_html_10