天天看點

Nginx功能部署(2)

文章目錄

      • 重定向
        • rewrite 子產品
        • 正規表達式全部符号解釋
        • 全局變量
        • 案例
          • 1. 比如通路 myr.club,自動跳到 www.myr.club。
          • 2. 防止域名惡意解析到伺服器IP
          • 3. http ------> https
            • $1的作用
          • 4.www.myr.club/abc----->abc.myr.club
          • 5.abc.westos.org----->www.myr.club/abc
      • nginx中的盜鍊與防盜鍊
        • 什麼是盜鍊?
        • 什麼是防盜鍊?
        • 實驗環境
        • 盜鍊的實作(server2盜取server1的資源)
        • 防盜鍊的實作(server1不讓server2盜取資源)

重定向

rewrite 子產品

  • rewrite

    是 nginx的靜态重寫子產品
  • 使用nginx提供的全局變量或自己設定的變量,結合正規表達式和标志位實作url重寫以及重定向。
  • rewrite隻能放在server{},location{},if{}中,并且隻能對域名後邊的除去傳遞的參數外的字元串起作用,例如 http:/myr.com/a/index.php?id=1&u=str 隻對/a/index.php重寫。
  • 基本用法是 rewrite patten replace flag
  • patten是正規表達式,與patten比對的URL會被改寫為replace,flag可選
  • Rewrite的Flags
  • last - 完成重寫指令後,搜尋相應的URI和位置。相當于Apache裡的[L]标記,表示完成rewrite,不再比對後面的規則。
  • break - 中止Rewirte,不在繼續比對。
  • redirect - 傳回臨時重定向的HTTP狀态302。
  • permanent - 傳回永久重定向的HTTP狀态301。
  • 共同點:
  • 301和302狀态碼都表示重定向,就是說浏覽器在到伺服器傳回的這個狀态碼後會自動跳轉到一個新的URL位址,這個位址可以從響應的Location首部中擷取(使用者看到的效果就是他輸入的位址A瞬間變成了另一個位址B)
  • 不同點:
  • 301表示舊位址A的資源已經被永久地移除了(這個資源不可通路了) ,搜尋引擎在抓取新内容的同時也将舊的網址交換為重定向之後的網址;302表示舊位址A的資源還在(仍然可以通路),這個重定向隻是臨時地從舊位址A跳轉到位址B,搜尋引擎會抓取新的内容而儲存舊的網址.
  • 上邊的 last 和 break 差別有點難以了解:
  1. last一般寫在server和if中,而break一般使用在location中
  2. last不終止重寫後的url比對,即新的url會再從server走一遍比對流程,而break終止重寫後的比對,break和last都能組織繼續執行後面的rewrite指令

正規表達式全部符号解釋

~

為區分大小寫比對

~*

為不區分大小寫比對

!~和!~*

分别為區分大小寫不比對及不區分大小寫不比對

^

比對輸入字元串的開始位置。

$

比對輸入字元串的結束位置。

/

通用比對, 如果沒有其它比對,任何請求都會比對到

全局變量

  • 下面是可以用作if判斷的全局變量:
  • $args

    : #這個變量等于請求行中的參數,同$query_string
  • $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相同。

案例

1. 比如通路 myr.club,自動跳到 www.myr.club。
  • vim nginx.conf

    ,找到 server 配置段
server {
        listen       80;
        server_name  www.myr.club myr.club;
        if ($host != 'www.myr.club') {
                rewrite ^/(.*)$ http://www.myr.club/$1 permanent;
}
           
  • 測試
    Nginx功能部署(2)
2. 防止域名惡意解析到伺服器IP
server {
listen 80;
server_name _;
return 500;
}
           
  • 也可以重定向:
server {
listen 80;
server_80 _;
rewrite ^(.*) http://www.baidu.com permanent;
}
           
3. http ------> https
[[email protected] objs]# cd /etc/pki/tls/certs
 [[email protected] certs]# make cert.pem
           
Nginx功能部署(2)
  • 将證書檔案複制到nginx下的conf目錄下
  • cp cert.pem /usr/local/nginx/conf/
server {
        listen       80;
        server_name  www.myr.club ;
        rewrite ^/(.*)$ https://www.myr.club/$1;


        location / {
            root   html;
            index  index.html index.htm;
        }
}

 server {
        listen       443 ssl;
        server_name  www.myr.club;

        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
           root   html;
           index  index.html index.htm;

    }

}
           
Nginx功能部署(2)
  • 用戶端浏覽器通路:
    Nginx功能部署(2)
    Nginx功能部署(2)
    Nginx功能部署(2)
  • 通路網頁成功
    Nginx功能部署(2)
  • 永久重定向
  • 僅改變這一行,其餘與上面相同
Nginx功能部署(2)

$1的作用

  • 服務端server1 /usr/local/nginx/html目錄下建立一個test.html網頁檔案。
[[email protected] html]# vim test.html
[[email protected] html]# cat test.html 
<h1>This is a test page!</h1>
           
  • 就按保持上面的配置檔案不變
    Nginx功能部署(2)
  • 再配置檔案中去掉$1後
Nginx功能部署(2)
  • 無法比對到後面的内容
4.www.myr.club/abc----->abc.myr.club
  • 實驗準備
  • vim nginx.conf
  • 添加一個server
server {
        listen       80;
        server_name  abc.myr.club ;

        location / {
            root   /abc;
            index  index.html index.htm;
        }
}
           
  • 在本機建立/abc目錄
[[email protected] conf]# mkdir /abc
[[email protected] conf]# cd /abc
[[email protected] abc]# echo "welcome to abc.myr.club" > index.html
           
  • 保證可以通路
    Nginx功能部署(2)
  • 在server1種編輯配置檔案
server { 
        listen       80;   
        server_name  www.myr.club ;
        rewrite ^/abc$ http:abc.myr.club permanent;
        rewrite ^/abc(.*)$ http:abc.myr.club/$1 permanent;
        
        location / {
            root   html;
            index  index.html index.htm;
        }
}
           
Nginx功能部署(2)
  • 其中$1的作用同上
5.abc.westos.org----->www.myr.club/abc
  • 改配置檔案
server {
        listen       80; 
        server_name  www.myr.club abc.myr.club;
        if ($host = "abc.myr.club") {
        rewrite ^/(.*)$ http://www.myr.club/abc/$1 permanent;

}
        location / {
            root   html;
            index  index.html index.htm;
        }

}
           
  • 重載服務後可能會出現下面這樣的報錯:
  • 在server1中:
nginx: [warn] conflicting server name "abc.myr.club" on 0.0.0.0:80, ignored
           
  • 是因為在其他的server種已經有abc.myr.club這個server_name,也就是上一個實驗所添加的,此時可以将其他server種這個域名改一下或者直接删掉
[[email protected] abc]# cd /usr/local/nginx/html
[[email protected] html]# mkdir abc
[[email protected] html]# echo "hello www.myr.club/abc" > index.html
           
Nginx功能部署(2)

nginx中的盜鍊與防盜鍊

什麼是盜鍊?

  • 盜鍊是指服務提供商自己不提供服務的内容,通過技術手段繞過其它有利益的最終使用者界面(如廣告)直接在自己的網站上向最終使用者提供其它服務提供商的服務内容,騙取最終使用者的浏覽和點選率,受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。

什麼是防盜鍊?

  • WEB應用防火牆通過實作URL級别的通路控制,對用戶端請求進行檢測

    如果發現圖檔、檔案等資源資訊的HTTP請求來自于其它網站,則阻止盜鍊請求,節省因盜用資源連結而消耗的帶寬和性能.

實驗環境

server1(192.168.43.10) 被盜鍊伺服器
server2(192.168.43.2) 盜鍊伺服器
真機 用戶端
  • 其實server1是真正有資源的web服務,server2上面沒有資源
  • 當客戶通路server2的時候拿到的是server1的資源,點選率卻是server2的,不利于server1伺服器的正常使用

盜鍊的實作(server2盜取server1的資源)

  • server1和server2都需要安裝nginx
  • 詳細安裝步驟見如下連接配接
  • nginx的安裝
  • server1中
  • 進入配置檔案

    vim /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  www.myr.club ;
}
        location / {
            root   html;
            index  index.html index.htm;
        }
}
           
  • /usr/local/nginx/html/

    中放一張圖檔用于測試
    Nginx功能部署(2)
  • server2安裝好後
  • 進入配置檔案

    vim /usr/local/nginx/conf/nginx.conf

server {

        listen 80;
        server_name daolian.myr.club;
        charset utf-8;

        location / {
        root /web;
        index index.html index.htm;
}
}
           

在server2中:編寫指向server1資源的檔案

[[email protected] conf]# mkdir /web
[[email protected] conf]# cd /web
[[email protected] web]# vim index.html
[[email protected] web]# cat index.html 
<html>
<body>
<br>daolian picture</br>
<img src="http://www.myr.club/linux.png">
</body>
</html>
           

在server2中寫解析檔案:

vim /etc/hosts

192.168.43.10 server1 www.myr.club
           
  • 在真機上進行測試

    在真機中編寫解析檔案:

    vim /etc/hosts

192.168.43.10 server1 www.myr.club
192.168.43.2 server2 daolian.myr.club
           
Nginx功能部署(2)
  • 實作盜鍊成功。其實這個圖檔資源是server1中的資源

防盜鍊的實作(server1不讓server2盜取資源)

server1編寫配置檔案

server {
        listen       80;
        server_name  abc.myr.club ;

        location / {
            root   /abc;
            index  index.html index.htm;
        }
}


    server {
        listen       80;
        server_name  www.myr.club ;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location ~*\.(gif|jpg|png|jpeg)$ {
                root html;
                valid_referers none blocked www.myr.club;
                if ($invalid_referer) {
                rewrite ^/ http://abc.myr.club/dl.png;
        }
}
}     
           
Nginx功能部署(2)
  • server1中:確定/abc中有反盜鍊圖檔檔案
[[email protected] conf]# cd /abc/
[[email protected] abc]# ls
dl.png  index.html
           
  • 測試
  • 在真機中編寫解析檔案:

    vim /etc/hosts

192.168.43.10 server1 www.myr.club abc.myr.club
192.168.43.2 server2 daolian.myr.club
           
Nginx功能部署(2)
  • 當server2盜鍊我時,我給他重定向到另外的站點。