五、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实现用户的一站式注册、登录、退出以及社区其他数据的交互。
管理员账号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.点直接访问站点
2.配置hosts, 访问论坛,分表帖子
# 查看帖子地址
http://discuz.linux.com/forum.php?mod=viewthread&tid=1&extra=page%3D1
3.配置rewrite伪静态
点页面右上角管理中心,点击上方全局,点击左侧SEO设置
在URL静态化中,把可用全都打钩,Rewrite兼容性选是
点击提交,点击查看当前的 Rewrite规则 (其他项目也是开发给)
# 把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;
}
# 现在直接在阿里云域名解析中设置标签@,如下图
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协议没有感知的情况下做到了数据的安全加密
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获取证书是否有效
3.模拟网站劫持
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.证书类型介绍
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/
浏览器会提示不安全,点击证书查看