nginx學習之——rewrite

rewrite配置在server{}、location{}、if{}段中 ,對Url中除去域名和參數的字符串起做用php

1、語法:rewrite regex replacement [flag];

regex:服務器接收到的請求地址
replacement:重寫後的請求地址
[flag]標誌位:html

  1. last: 表示完成rewritelinux

  2. break: 表示跳出rewrite服務器

  3. redirect: 返回302臨時重定向cookie

  4. permanent: 返回301永久重定向url

2、rewrite與location

rewrite是在同一域名內更改獲取資源的路徑
location是對一類路徑作控制訪問或反向代理,能夠proxy_pass到其餘機器。代理

3、服務器解析url請求的過程

st=>start: URL請求
op1=>operation: server{}的rewrite
cond1=>condition: 是否重寫url
op2=>operation: location匹配
cond2=>condition: 是否重寫
op3=>operation: location{}的rewrite
cond3=>condition: 是否重寫
op4=>operation: 響應結果
e=>end: 結束

st->op1->cond1
cond1(yes,right)->op1
cond1(no)->op2->cond2
cond2(yes,right)->op1
cond2(no)->op3->cond3
cond3(yes,right)->op1
cond3(no)->op4->e

這樣的循環超過10次,服務器會返回500錯誤提示日誌

4、相關指令

set : 設置變量
return : 返回狀態碼
if(條件){} :設定條件,再進行重寫
if條件判斷寫法:
1: = 用於字符串比較
2: ~ 區分大小寫正則匹配;
  ~* 不區分大小寫正則匹配
3: -f 是否爲文件
  -d 是否爲目錄
  -e 是否存在
4: 當表達式只是一個變量時,若是值爲空或任何以0開頭的字符串都會當作false
eg.code

if  ($remote_addr = 192.168.1.100) {
                return 403;
}
 if ($http_user_agent ~ MSIE) {
                rewrite ^.*$ /ie.htm;
                break; #不break會循環重定向
 }
 if (!-e $document_root$fastcgi_script_name) {
    rewrite ^.*$ /404.html break;
 }

5、重寫示例

Goods-3.html ---->Goods.php?goods_id=3
goods-([\d]+)\.html ---> goods.php?goods_id =$1  

location /ecshop {
index index.php;
rewrite goods-([\d]+)\.html$ /ecshop/goods.php?id=$1;
rewrite article-([\d]+)\.html$ /ecshop/article.php?id=$1;
rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$1&brand=$2;

rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;

rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d+\.])-(\d+)-([^-]+)-([^-]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
}

location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.leizhenfang.com;
    if ($invalid_referer) {
        return 404;
    } //防盜鏈
}

http {
    # 定義image日誌格式
    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
    # 開啓重寫日誌
    rewrite_log on;
 
    server {
        root /home/www;
 
        location / {
                # 重寫規則信息
                error_log logs/rewrite.log notice; 
                # 注意這裏要用‘’單引號引發來,避免{}
                rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
                # 注意不能在上面這條規則後面加上「last」參數,不然下面的set指令不會執行
                set $image_file $3;
                set $image_type $4;
        }
 
        location /data {
                # 指定針對圖片的日誌格式,來分析圖片類型和大小
                access_log logs/images.log mian;
                root /data/images;
                # 應用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,若是還不在就跳轉到最後一個url裏
                try_files /$arg_file /image404.html;
        }
        location = /image404.html {
                # 圖片不存在返回特定的信息
                return 404 "image not found\n";
        }
}

6、全局變量

  • $args : #這個變量等於請求行中的參數,同$query_stringorm

  • $content_length : 請求頭中的Content-length字段。

  • $content_type : 請求頭中的Content-Type字段。

  • $document_root : 當前請求在root指令中指定的值。

  • $host : 請求主機頭字段,不然爲服務器名稱。

  • $http_user_agent : 客戶端agent信息

  • $http_cookie : 客戶端cookie信息

  • $limit_rate : 這個變量能夠限制鏈接速率。

  • $request_method : 客戶端請求的動做,一般爲GET或POST。

  • $remote_addr : 客戶端的IP地址。

  • $remote_port : 客戶端的端口。

  • $remote_user : 已經通過Auth Basic Module驗證的用戶名。

  • $request_filename :當前請求的文件路徑,由root或alias指令與URI請求生成。

  • $scheme : HTTP方法(如http,https)。

  • $server_protocol : 請求使用的協議,一般是HTTP/1.0或HTTP/1.1。

  • $server_addr : 服務器地址,在完成一次系統調用後能夠肯定這個值。

  • $server_name : 服務器名稱。

  • $server_port : 請求到達服務器的端口號。

  • $request_uri : 包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。

  • $uri : 不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。

  • $document_uri : 與$uri相同。

例:http://localhost:88/test1/test2/test.php

$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/tes...
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

參考文檔

https://linux.cn/article-5714...

相關文章
相關標籤/搜索