Nginx Rewrite
阿新 • • 發佈:2018-09-29
概述 示例 htm 返回 root 規則 路徑名 index 優先級 Nginx Rewrite
Rewrite基本概述
1.什麽是rewrite
Rewrite
即URL
重寫, 主要實現url
地址重寫, 以及重定向, 就是把傳入Web
的請求重定向到其他URL
的過程。
2.Rewrite使用場景
1.URL
地址跳轉,例如用戶訪問bgx.com
將其跳轉到xuliangwei.com
, 或者當用戶通過http
的方式訪問bgx.com
時,將其跳轉至https
的方式訪問bgx.com
2.URL
偽靜態, 將動態頁面顯示為靜態頁面方式的一種技術, 便於搜索引擎的錄入, 同時減少動態URL
地址對外暴露過多的參數, 提升更高的安全性。
3.搜索引擎SEO
優化依賴於url
路徑, 以便支持搜索引擎錄入
Rewrite配置語法
Rewrite示例
Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if
在匹配過程中可以引用一些Nginx的全局變量
$document_root 針對當前請求的根路徑設置值; $host 請求信息中的"Host",如果請求中沒有Host行,則等於設置的服務器名; $request_filename 當前請求的文件路徑名(帶網站的主目錄/code/images/test.jpg) $request_uri 當前請求的文件路徑名(不帶網站的主目錄/images/test.jpg) $scheme用的協議,比如http或者https
Rewrite匹配優先級
1.執行server塊的rewrite指令
2.執行location匹配
3.執行選定的location中的rewrite
例1:用戶訪問/abc/1.html實際上真實訪問是/ccc/bbb/2.html
#http://www.bgx.com/abc/1.html ==> http://www.bgx.com/ccc/bbb/2.html //1.準備真實的訪問路徑 [root@web03 ~]# mkdir /code/ccc/bbb -p [root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html //2.Nginx跳轉配置 [root@web03 conf.d]# cat ccbb.conf server { listen 80; location / { root /code; index index.html; } location /abc { rewrite (.*) /ccc/bbb/2.html redirect; #return 302 /ccc/bbb/2.html; } } [root@web03 ~]# systemctl restart nginx
例2:用戶訪問/2018/ccc/bbb/2.html實際上真實訪問是/2014/ccc/bbb/2.html
#http://www.bgx.com/2018/ccc/bbb/2.html ==> http://www.bgx.com/2014/ccc/bbb/2.html
//1.準備真實的訪問路徑
[root@web03 ~]# mkdir /code/2014/ccc/bbb -p
[root@web03 ~]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html
//2.Nginx跳轉配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
}
[root@web03 ~]# systemctl restart nginx
例3:用戶訪問/test目錄下任何內容, 實際上真實訪問是http://www.xuliangwei.com
location /test {
rewrite (.*) http://www.xuliangwei.com redirect;
}
例4:用戶訪問course-11-22-33.html實際上真實訪問是/course/11/22/33/course_33.html
#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html
//1.準備真實的訪問路徑
[root@web03 ~]# mkdir /code/course/11/22/33/ -p
[root@web03 ~]# echo "Curl docs.etiantian.org" > /code/course/11/22/33/course_33.html
//2.Nginx跳轉配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
root /code;
index index.html;
location / {
#靈活
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定
#rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
[root@web03 ~]# systemctl restart nginx
例5:將http請求,跳轉至https
server {
listen 80;
server_name bgx.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name bgx.com;
ssl on;
}
Rewrite標記Flag
rewrite
指令根據表達式來重定向URI
, 或者修改字符串。 可以應用於server,location, if
環境下, 每行rewrite
指令最後跟一個flag
標記,支持的flag
標記有如下表格所示:
flag
last 本條規則匹配完成後,繼續向下匹配新的location URI規則
break 本條規則匹配完成後,停止匹配,不在匹配後面的規則
redirect 返回302臨時重定向, 地址欄會顯示跳轉後的地址
permanent 返回301永久重定向, 地址欄會顯示跳轉後的地址
對比flag中break與last
公司目前產品有一個url地址是www.oldboy.com/2017_old隨著時間的推移,
公司希望客戶通過新的url訪問www.oldboy.com/2019_new需要保證瀏覽器的url地址不發生變化
[root@m01 ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name www.oldboy.com;
root /code;
rewrite_log on;
location ~ ^/2019_new {
rewrite ^/2019_new /2017_old/ break;
}
location ~ ^/2020_new {
rewrite ^/2020_new /2017_old/ last;
}
location ~ ^/2017_old {
root /code;
index index.html;
}
}
#
[root@m01 conf.d]# mkdir /code/2017_old
[root@m01 conf.d]# echo "2017_old" > /code/2017_old/index.html
last
與break
對比總結:
last
1.last進行Rewrite匹配成功, 停止當前這個請求, 並根據rewrite匹配的規則重新向Server發起一個請求。
2.新請求的內容是域名+URL, 對應的地址為www.oldboy.com/2017_old
break
1.break進行Rewrite匹配成功後, 不會像last重新發起請求, 首先查找站點目錄下/code/2017_old/默認返回頁是否存在, 如不存在則404, 如存在繼續往下匹配
2.根據Rewrite匹配的規則, 跳轉至www.oldboy.com/2017_old/的URL地址, 匹配成功後則不繼續匹配
對比flag
中redirect
與permanent
[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name localhost;
root /soft/code;
location ~ ^/bgx {
rewrite http://kt.xuliangwei.com redirect;
rewrite http://kt.xuliangwei.com permanent;
#return 301 http://kt.xuliangwei.com;
#return 302 http://kt.xuliangwei.com;
}
Nginx Rewrite