Nginx的重寫指令用於改變客戶端的URL請求。主要有return
和rewrite
。兩個指令都有重寫URL的能力,但rewrite
支持更復雜的功能。
Return指令
在server
中返回 301 重定向:
server {
listen 80;
server_name www.olddomain.com;
return 301 $scheme://www.newdomain.com$request_uri;
}
在 location
中返回 301 重定向:
location = /tutorial/learning-nginx {
return 301 $scheme://example.com/nginx/understanding-nginx
}
Rewrite指令
語法介紹
rewrite regex replacement-url [flag];
- regex: 正則表達式
- replacement-url: 替換的URL
- flag: 用於進行一些額外的處理
不同flag的效果:
flag | 說明 |
---|---|
last | 停止解析,並開始搜索與更改后的URI 相匹配的location ; |
break | 中止 rewrite,不再繼續匹配 |
redirect | 返回臨時重定向的 HTTP 狀態 302 |
permanent | 返回永久重定向的 HTTP 狀態 301 |
注意:rewrite
只能返回301和302狀態碼,如果需要返回其他狀態碼,可以在rewrite
命令后使用return
案例
簡單案例
把https://example.com/nginx-tutorial
重寫為https://example.com/somePage.html
location = /nginx-tutorial
{
rewrite ^/nginx-tutorial?$ /somePage.html last;
}
動態替換案例
把https://www.example.com/user.php?id=11
重寫為https://exampleshop.com/user/11
location = /user.php
{
rewrite ^/user.php?id=([0-9]+)$ /user/$1 last;
}
其中$1
表示regex
中第一個括號中的值,第二個括號中的值可通過$2
獲取
手機訪問重定向網址
把https://www.example.com
重寫為https://m.exampleshop.com
location = /
{
if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
rewrite ^(.*) https://m.example.com$1 redirect;
}
}