Nginx配置

2021.7.12 星期一 :

配置https

rewrite方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server {
listen 80;
server_name shfxx.test.com;
rewrite ^(.*)$ https://$host$1 permanent;

}

server {
listen 443 ssl;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/START-smartcampus-org-cn.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/START-smartcampus-org-cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL
:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS; ssl_session_cache builtin:1000 shared:SSL:10m;
server_name shfxx.test.com;
access_log /data/wwwroot/sfzxxx/logs/access_campus.log combined;
error_log /data/wwwroot/sfzxxx/logs/error_campus.log;
root /data/wwwroot/sfzxxx/campus;
index index.html index.htm index.php;
location / {
if (!-e $request_filename) {
rewrite ^/admin/(.*)$ /admin.php/$1 last;
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ [^/]\.php(/|$) {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}

}

三、nginx的497状态码

释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码

利用error_page命令将497状态码的链接重定向到https://test.com这个域名上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {  
listen 192.168.1.11:443; #ssl端口
listen 192.168.1.11:80; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口
server_name test.com;
#为一个server{......}开启ssl支持
ssl on;
#指定PEM格式的证书文件
ssl_certificate /etc/nginx/test.pem;
#指定PEM格式的私钥文件
ssl_certificate_key /etc/nginx/test.key;

#让http请求重定向到https请求
error_page 497 https://$host$uri?$args;
}

四、index.html刷新网页

上述两种方法均会耗费服务器的资源,

1
2
3
<html>  
<meta http-equiv="refresh" content="0;url=https://test.com/">
</html>
1
2
3
4
5
6
7
8
9
10
11
server {  
listen 192.168.1.11:80;
server_name test.com;

location / {
#index.html放在虚拟主机监听的根目录下
root /srv/www/http.test.com/;
}
#将404的页面重定向到https的首页
error_page 404 https://test.com/;
}

代理

同一域名映射

1、nginx修改root映射
2、通过nginx rewrite内部跳转实现访问重定向
3、nginx设置别名alias映射实现
4、通过nginx的permanent 301绝对跳转实现
5、通过判断uri实现页面跳转

反向代理

location路径设置
一. location匹配路径末尾没有 /

此时proxy_pass后面的路径必须和location设置的路径一致:

location /index
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/index;
}

外面访问:http://romotehost/index/index.html
相当于访问:http://localhost:8080/index/index.html

二. location匹配路径末尾有 /

此时proxy_pass后面的路径需要分为以下四种情况讨论:

proxy_pass后面的路径只有域名且最后没有 /:

location /index/
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080;
}

外面访问:http://romotehost/index/index.html
相当于访问:http://localhost:8080/index/index.html

proxy_pass后面的路径只有域名同时最后有 /:

location /index/
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/;
}

外面访问:http://romotehost/index/index.html
相当于访问:http://localhost:8080/index.html

proxy_pass后面的路径还有其他路径但是最后没有 /:

location /index/
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/test;
}

外面访问:http://romotehost/index/index.html
相当于访问:http://localhost:8080/testindex.html

proxy_pass后面的路径还有其他路径同时最后有 /:

location /index/
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/test/;
}

外面访问:http://romotehost/index/index.html
相当于访问:http://localhost:8080/index/index.html

跨域header

1
2
3
4
5
6
7
location / {  
add_header Access-Control-Allow-Origin *;
; add_header 'Access-Control-Allow-Origin' 'http://domain:port' always;
; add_header 'Access-Control-Allow-Credentials' 'true';
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}

2.Nginx配置域名跨域多个域名

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
set $cors '';
if ($http_origin ~* "^http://deomain01:port$") {
set $cors $http_origin;
}
if ($http_origin ~* "^http://deomain02:port$") {
set $cors $http_origin;
}
if ($http_origin ~* "^http://deomain002:port$") {
set $cors $http_origin;
}
location /live{
...
add_header 'Access-Control-Allow-Origin' '$cors';
add_header 'Access-Control-Allow-Credentials' 'true';
# 为预检请求加的header
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE';
#为预检请求加的header
add_header 'Access-Control-Allow-Headers' '*';
}

方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map $http_origin $cors_list{
default http://aaa.cn;
"~ http://bbb.cn" http://bbb.cn;
}
server {
listen 8089;
server_name localhost;
location /live{
...
add_header 'Access-Control-Allow-Origin' '$cors_list';
add_header 'Access-Control-Allow-Credentials' 'true';
# 为预检请求加的header
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE';
#为预检请求加的header
add_header 'Access-Control-Allow-Headers' '*';
}

map指令是ngx_http_map_module模块提供的,默认情况下nginx有加载这个模块。

语法: map $var1 $var2 {…}
默认值: -
配置段: http

map为一个变量设置的映射表。映射表由两列组成,匹配模式和对应的值。
在map块里的参数指定了源变量值和结果值的对应关系。

default: 没有匹配结果将使用的默认值。如果没有设置default,将会用一个空的字符串作为默认的结果。

匹配模式可以是一个简单的字符串或者正则表达式,使用正则表达式要用(‘~’)。

注意:在nginx.conf配置文件配置跨域时,记得清除客户端如浏览器缓存,否则会出现配置没生效的情况。

方法三

#3 Nginx配置跨域请求 Access-Control-Allow-Origin *

1
2
3
4
5
6
7
8
location / {

if ($http_origin ~* (http?://.*\.aliuncle\.top$)) {
add_header Access-Control-Allow-Origin $http_origin;
}
index index.php;
try_files $uri $uri/ /index.php?$args;
}

正则匹配三级域名

knowledge is no pay,reward is kindness
0%