nginx测试rewrite

nginx测试rewrite

sh 复制代码
last :相当于 Apache 里的(L)标记,表示完成rewrite 匹配;
break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则。
# 其中last 和 break 用来实现 URL 重写时,浏览器地址栏URL 地址不变
redirect: 返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址。
permanent: 返回 301永久重定向,浏览器地址栏会显示跳转后的URL 地址
#不配置将显示304
复制代码
[root@node1 ~]# yum -y install gcc make pcre-devel openssl-devel
[root@node1 ~]# tar xf nginx-1.22.1.tar.gz
[root@node1 ~]# cd nginx-1.22.1/
[root@node1 nginx-1.22.1]# ./configure  --prefix=/usr/local/nginx  --user=nginx  --with-http_ssl_module
[root@node1 nginx-1.22.1]#  make && make install
[root@node1 nginx-1.22.1]# useradd nginx -s /sbin/nologin
[root@node1 nginx-1.22.1]# /usr/local/nginx/sbin/nginx
sh 复制代码
[root@node1 nginx-1.22.1]# cd /usr/local/nginx/
[root@node1 nginx]# mkdir html/static
[root@node1 nginx]# echo "html/static/index.html">html/static/index.html
[root@node1 nginx]# echo "html/static/node1.html">html/static/node1.html


#访问显示
http://www.myweb.com/static/ -->  html/static/index.html
http://www.myweb.com/static/test.html -->  html/static/test.html
http://www.myweb.com/forum.php -->  404 Not Found

last :相当于 Apache 里的L)标记,表示完成rewrite 匹配;

break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则。

redirect: 返回 302 临时重定向,浏览器地址会显示跳转后的URL 地址。

permanent: 返回301永久重定向,浏览器地址栏会显示跳转后的 URL 地址。

其中 last 和 break 用来实现 URL 重写时,浏览器地址栏URL 地址不变。

sh 复制代码
#访问  http://www.myweb.com/forum.php  -跳转->  html/static/test.html

server {
        listen       80;
        server_name www.myweb.com;

# 本地目录重写
        # 状态码304 地址栏不变化  http://www.myweb.com/forum.php
        rewrite ^/forum.php$ /static/node1.html last;  

        # 状态码304 地址栏不变化  http://www.myweb.com/forum.php
        rewrite ^/forum.php$ /static/node1.html break;  
        
        # 状态码301 地址栏变为http://www.myweb.com/static/test.html
        rewrite ^/forum.php$ /static/test.html permanent;
        
        # 状态码302 地址栏变为http://www.myweb.com/static/test.html
        rewrite ^/forum.php$ http://www.myweb.com/static/test.html last;

#本站 url跳转  url地址栏变化, last、break、redirect都是302
        # 状态码302 地址栏变为http://www.myweb.com/static/test.html
        rewrite ^/forum.php$ http://www.myweb.com/static/test.html last;

		#forum.php状态码301 地址栏变为http://www.myweb.com/static/test.html
        rewrite ^/forum.php$ http://www.myweb.com/static/test.html permanent;
		
# 跳百度
        # forum.php状态码302 地址栏变为 http://www.baidu.com
        rewrite ^/forum.php$ http://www.baidu.com break; # last、redirect也是302
        
		#forum.php状态码301 地址栏变为 http://www.baidu.com
        rewrite ^/forum.php$ http://www.baidu.com permanent;
        location / {...

浏览器Disable cache 访问
sh 复制代码
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        root html; # 绝对路径也可以完成访问   /usr/local/nginx/html;
    }
sh 复制代码
[root@node1 baidu]# wget -r -x http://fjxplz.com/1004.html


[root@node1 html] mkdir weihu
[root@node1 html]# echo   "维护中...">weihu/index.html

#  http://www.myweb.com   维护
server {
        listen       80;
        server_name www.myweb.com;
        # 3、最终还是跳到维护页面
        rewrite ^/forum.php$ http://www.myweb.com/static/test.html permanent  ;
        
		# 2、加了rewrite后跳转,跟下面的location的上下顺序影响
		rewrite ^/(.*)$ /weihu/index.html last;  # 所有页都跳维护页
        rewrite ^/$ /weihu/index.html last;   # 根页跳到维护页
        #rewrite ^/(.*)$ /weihu/index.html last;
        
        # 1、不加上面的rewrite时,默认首页 
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        #    location / {   与上面一样
            root html; # 绝对路径也可以完成访问   /usr/local/nginx/html;
        }        
        
 
# 3、最终还是跳到维护页面
 http://www.myweb.com/forum.php--》static  --》2 /weihu/
192.168.1.11 - -  "GET /forum.php HTTP/1.1" 301 169 "-" "Wget/1.14 (linux-gnu)"
192.168.1.11 - -  "GET /static/test.html HTTP/1.1" 200 13 "-" "Wget/1.14 (linux-gnu)"
sh 复制代码
server {
        listen       80;
        server_name www.myweb.com;
        # 一直会301跳转,看日志或者wget看下过程
        rewrite ^/(.*)$ /weihu/index.html permanent;  # wget下或者看日志
        
        # 传递参数
        rewrite ^/(.*)$  http://www.baidu.com/$1 permanent;
        
        # myweb.com 跳转到baidu
        if ($host = 'myweb.com') {
        rewrite ^/(.*)$  http://www.myweb.com/$1 permanent;
        }

wget 查看

sh 复制代码
[root@node1 conf]# wget myweb.com
--2023-10-21 17:32:25--  http://myweb.com/
Resolving myweb.com (myweb.com)... 192.168.1.11
Connecting to myweb.com (myweb.com)|192.168.1.11|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently  # permanent
Location: http://www.myweb.com/ [following]
--2023-10-21 17:32:25--  http://www.myweb.com/	# 跳转后的 
Resolving www.myweb.com (www.myweb.com)... 192.168.1.11
Reusing existing connection to myweb.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 13 [text/html]
Saving to: 'index.html.2'


# myweb.com 跳转到www.myweb.com
        if ($host = 'myweb.com') {
        rewrite ^/(.*)$  http://www.myweb.com/$1 last; # last不是上面的permanent
        }
[root@node1 conf]# wget myweb.com
--2023-10-21 17:30:57--  http://myweb.com/
Resolving myweb.com (myweb.com)... 192.168.1.11
Connecting to myweb.com (myweb.com)|192.168.1.11|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily #302  last
Location: http://www.myweb.com/ [following]
--2023-10-21 17:30:57--  http://www.myweb.com/	# 跳转后的   
Resolving www.myweb.com (www.myweb.com)... 192.168.1.11
Reusing existing connection to myweb.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 13 [text/html]
Saving to: 'index.html.1'

多种域名跳转

sh 复制代码
# 多种域名跳转
	if ($host != 'myweb.com'){
    	rewrite ^/(.*)s http://www.myweb.com/$1 permanent;
    }
# 不存在的页面跳转    
	if ( !-e $request_filename){
	rewrite ^/(.*)$ /weihu/index.html last;
	}

# 火狐浏览器跳转   
	if ($http_user_agent ~ firefox) { 
		rewrite  ^/index.html$  /firefox/index.html;
	}

Nginx:Rewrite跳转+正则表达式+6个生产案列!内容过于真实

https://blog.csdn.net/weixin_48190891/article/details/108532802

Nginx rewrite常用全局变量详细介绍

https://blog.csdn.net/Blue92120/article/details/129003292

复制代码
upstream lmsManagerAuth-backend {
server 7.180.171.42:8100 max_fails=3 fail_timeout=10s;
}


location ~ ^/edx/lmsManagerAuth/api/datacenter/.*{
  rewrite /edx/lmsManagerAuth/(.*)  /$1 break;  #截取保留重写为api/datacenter/.*
  proxy_pass http://lmsManagerAuth-backend;
sh 复制代码
www.myweb.com.zh		www.myweb.com/zh
www.myweb.com.en		www.myweb.com/en


在原来的配置文件/usr/local/nginx/conf/nginx.conf的http{}内末尾处加一句:
include /usr/local/nginx/conf.d/*.conf;

[root@node1 nginx]# mkdir -p /usr/local/nginx/conf.d/
[root@node1 nginx]# vim conf.d/www.myng.com.conf
server {
	listen 80;
	server_name www.myng.com;
	location / {
	root /code;
	index index.html;
}
[root@node1 nginx]# mkdir -p /code/{zh,en}

[root@node1 nginx]# echo  zh>/code/zh/index.html
[root@node1 nginx]# echo  en>/code/en/index.html
[root@node1 nginx]# echo code>/code/index.html
[root@node1 html]# curl  www.myng.com
code
[root@node1 html]# curl  www.myng.com/en/
en
[root@node1 html]# curl  www.myng.com/zh/   #浏览器里默认加/ 
zh


server {
	listen 80;
	server_name www.myng.com.zh  www.myng.com.en;
	root /code;
	index index.html;
	location / {
	
        if ($http_host ~* 'zh'){   
        #$http_host 请求的host的
        #$http_accept_language  浏览器请求头里的语言标识
        #$http_user_agent  ~* "iphone|ipad|androaid"   基于agent
        	set $language zh;
        }
        
        if ($http_host ~* 'en'){
        	set $language en;
        }  
        
     	rewrite ^/$ http://www.myng.com/$language redirect;
        
}
复制代码
http://www.myng.com.zh/     --跳转-->  http://www.myng.com/zh/

curl -Lv

复制代码
[root@node1 html]# curl -Lv  www.myng.com.zh    #会自动重定向后边指定的网址
* About to connect() to www.myng.com.zh port 80 (#0)
*   Trying 192.168.1.11...
* Connected to www.myng.com.zh (192.168.1.11) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.myng.com.zh
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.22.1
< Date: Sun, 22 Oct 2023 12:53:43 GMT
< Content-Type: text/html
< Content-Length: 145
< Connection: keep-alive
< Location: http://www.myng.com/zh
<
* Ignoring the response-body
* Connection #0 to host www.myng.com.zh left intact
* Issue another request to this URL: 'http://www.myng.com/zh'
* About to connect() to www.myng.com port 80 (#1)
*   Trying 192.168.1.11...
* Connected to www.myng.com (192.168.1.11) port 80 (#1)
> GET /zh HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.myng.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.22.1
< Date: Sun, 22 Oct 2023 12:53:43 GMT
< Content-Type: text/html
< Content-Length: 169
< Location: http://www.myng.com/zh/
< Connection: keep-alive
<
* Ignoring the response-body
* Connection #1 to host www.myng.com left intact
* Issue another request to this URL: 'http://www.myng.com/zh/'
* Found bundle for host www.myng.com: 0x2014450
* Re-using existing connection! (#1) with host www.myng.com
* Connected to www.myng.com (192.168.1.11) port 80 (#1)
> GET /zh/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.myng.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.22.1
< Date: Sun, 22 Oct 2023 12:53:43 GMT
< Content-Type: text/html
< Content-Length: 3
< Last-Modified: Sun, 22 Oct 2023 11:48:01 GMT
< Connection: keep-alive
< ETag: "65350bf1-3"
< Accept-Ranges: bytes
<
zh
* Connection #1 to host www.myng.com left intact

# 不加-L选项的
[root@node1 html]# curl -v  www.myng.com.zh
* About to connect() to www.myng.com.zh port 80 (#0)
*   Trying 192.168.1.11...
* Connected to www.myng.com.zh (192.168.1.11) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.myng.com.zh
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.22.1
< Date: Sun, 22 Oct 2023 12:54:30 GMT
< Content-Type: text/html
< Content-Length: 145
< Connection: keep-alive
< Location: http://www.myng.com/zh
<
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
* Connection #0 to host www.myng.com.zh left intact

根据浏览器,agent跳转

sh 复制代码
server {
	listen 80;
	server_name www.myng.com.zh  www.myng.com.en;
	root /code;
	index index.html;
    location / {
#场景1: 根据用户浏览器的语言,自动跳转至不同的页面。	
        if ($http_accept_language ~* 'zh'){   
        	set $language zh;
        }
        
        if ($http_accept_language ~* 'en'){
        	set $language en;
        }  
        
     	rewrite ^/$ http://www.myng.com/$language redirect;
        
}

#2: 根据用户来源终端设备跳转至不同站点或不同域名
		if ($http_user_agent  ~* "iphone|ipad|androaid"){
        	rewrite ^/$ http://www.myng.com/m;
        }
        
#3:传递跳转的uri
		if ($http_user_agent  ~* "iphone|ipad|androaid"){
        	return 302 http://www.myng.com$request_uri;  #将uri传递
        }
        

api地址跳转

复制代码
#api.myng.com/bbb   www.myng.com/api/bbb

server {
	listen 80;
	server_name api.myng.com;
	if ($http_host ~* (.*)\.(.*)\.(.*)){
		set $domain $1;
	}
	rewrite ^/(.*)$  http://www.myng.com/$domain/$1 last;
}

维护页面

sh 复制代码
server {
	listen 80;
	server_name www.myng.com.zh  www.myng.com.en;
	root /code;
	rewrite ^/(.*)$ /wh.html break; #放在server下
	
    location / {...

根据状态码跳转

sh 复制代码
server {
	listen 80;
	server_name www.myng.com;
	root /code;
	index index.html;
...    
            error_page   500 502 503 504  =@temp;
	location @temp {
		root /data/error
		rewrite ^/(.*)$ /wh.html break; #放在server下	
	}

根据ip区分用户

sh 复制代码
server {
	listen 80;
	server_name www.myng.com;
	root /code;
	set $ip 0;
	if ($remote_addr ~ "10.0.0.1") { #X-Forwarded-For代理ip
		set $ip 1;
    }
    if  ($ip=0){
    	rewrite  ^/(.*)$ /wh.html break; #放在server下
    }

return 返回跳转

sh 复制代码
需求: 如果用户请求www.myng.com/test,则返回至ww.xuliangwei.com的url

server {
        listen 80;
        server_name www.myng.com;
        location / {
        
            default_type text/html;# 需要设置--》识别返回字符串
            if ($request_uri  ~* '^/test'){
                return 200 "return test";
                #return 302 http://www.baidu.com;   #302跳转到百度
            }

            root /code;
            index index.html;
        }
}


#浏览器访问:返回
http://www.myng.com/test     return test

last break

当rewrite规则遇到break后,本locationf与其他ocation的所有rewrite/return规则都不再执行。

当rewrite规则遇到last后,本locationh里后续rewrite/return规则不执行,但重写后的url再次从头开始执行所有规则,哪个匹配执行哪个

sh 复制代码
server {
	listen 80;
	server_name www.myng.com;
	root /code;
	location / {
		#http://www.myng.com/1.html    b.html
		rewrite /1.html /2.html;
            #http://www.myng.com/1.html    2.html
            #rewrite /1.html /2.html break; #break终止,不再匹配
            #http://www.myng.com/1.html    a.html 
            #rewrite /1.html /2.html last; #last终止当前location的匹配
            
		rewrite /2.html /3.html;
	}
	
	location /2.html {
		rewrite /2.html /a.html;
	}
	
	location /3.html {
	rewrite /3.html /b.html;
	}
}

[root@node1 nginx]# echo 1.html>/code/1.html
[root@node1 nginx]# echo 2.html>/code/2.html
[root@node1 nginx]# echo 3.html>/code/3.html
[root@node1 nginx]# echo a.html>/code/a.html
[root@node1 nginx]# echo b.html>/code/b.html
相关推荐
TG:@yunlaoda360 云老大11 分钟前
华为云国际站代理商CSBS主要有什么作用呢?
运维·服务器·数据库·华为云
像名字一样难取的昵称1 小时前
Linux学习笔记:十八、Linux文件的压缩,解压缩一站式学习
linux·运维·笔记·学习·ubuntu·ssh
Trouvaille ~2 小时前
【Linux】库制作与原理(二):ELF格式与静态链接原理
linux·运维·c语言·操作系统·动静态库·静态链接·elf文件
写代码的橘子n3 小时前
IPV6复习(基础入手版)
运维·服务器·网络
ICT技术最前线3 小时前
H3C双WAN口策略路由配置技术教程
运维·网络·h3c·策略路由
一分半心动3 小时前
windows docker desktop 安装VibeVoice
运维·docker·容器
向日葵.3 小时前
中间件交接文档
linux·运维·服务器
LucidX3 小时前
Docker核心操作实战
运维·docker·容器
隔壁阿布都3 小时前
Docker Compose中的网络管理
运维·docker·容器
云和数据.ChenGuang4 小时前
运维工程师技术教程之Pull Requests(PR)
运维·分布式·git·数据库运维工程师·运维教程