## 概述
重寫URL是非常有用的一個功能,因為它可以讓你提高搜索引擎閱讀和索引你的網站的能力;而且在你改變了自己的網站結構后,無需要求用戶修改他們的書簽,無需其他網站修改它們的友情鏈接;它還可以提高你的網站的安全性;而且通常會讓你的網站更加便于使用和更專業。
### Nginx Rewrite規則相關指令
Nginx Rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。
## Rewrite
重寫,寫在server段或者location段都可,后出現的先應用
```
#判斷訪問地址
if ($remote_addr = 192.168.1.100) {
return 403;
}
#判斷訪問的是否ie;
if ($http_user_agent ~ MSIE) {
rewrite ^.*$ /ie.htm;
break; #不break會循環重定向(是ie重寫到ie.htm,然后又發現是ie,又重寫到ie.htm...)
}
#跳轉到404
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html;
break;
}
```
**注意: Nginx對配置的格式非常的嚴格,if后面一定要有空格,運算符前后也必須要用空格隔開**
If 空格 (條件) {
重寫模式
}
> rewrite的核心還是正則表達式,其他的只要知道其語法規則既可
### **規則參考**
~ 為區分大小寫匹配
~* 為不區分大小寫匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配
-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行
last 相當于Apache里的[L]標記,表示完成rewrite,呵呵這應該是最常用的
set 設置變量
return 返回狀態碼
break 終止匹配, 不再匹配后面的規則
redirect 返回302臨時重定向 地址欄會顯示跳轉后的地址
permanent 返回301永久重定向 地址欄會顯示跳轉后的地址
### **內置變量參考**
$args, 請求中的參數;
$content_length, HTTP請求信息里的"Content-Length";
$content_type, 請求信息里的"Content-Type";
$document_root, 針對當前請求的根路徑設置值;
$document_uri, 與$uri相同;
$host, 請求信息中的"Host",如果請求中沒有Host行,則等于設置的服務器名;
$limit_rate, 對連接速率的限制;
$request_method, 請求的方法,比如"GET"、"POST"等;
$remote_addr, 客戶端地址;
$remote_port, 客戶端端口號;
$remote_user, 客戶端用戶名,認證用;
$request_filename, 當前請求的文件路徑名
$request_body_file
$request_uri, 請求的URI,帶查詢字符串;
$query_string, 與$args相同;
$scheme, 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_protocol, 請求的協議版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服務器地址,如果沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(造成資源浪費);
$server_name, 請求到達的服務器名;
$server_port, 請求到達的服務器端口號;
$uri, 請求的URI,可能和最初的值有不同,比如經過重定向之類的。
> 以上變量也可以用打印日志哦
### 范例分析
**Example1**
不存在的文件跳到404.html
```
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html;
break;
}
/*
要加break,以 xx.com/dsafsd.html這個不存在頁面為例,我們觀察訪問日志, 日志中顯示的訪問路徑,依然是GET /dsafsd.html HTTP/1.1
提示: 服務器內部的rewrite和302跳轉不一樣.302跳轉url會改變,變成重新http請求404.html, 而內部rewrite, 上下文沒變,
就是說 fastcgi_script_name 仍然是 dsafsd.html,因此會循環重定向.
*/
```
**Example2**
在不使用break的情況下,對ie訪問進行重寫
```
if ($http_user_agent ~* msie) { //如果是ie訪問的話設變量為1;
set $isie 1;
}
if ($fastcgi_script_name = ie.html) { //如果訪問的腳本為ie.html,變量為0;
set $isie 0;
}
if ($isie 1) { //綜合起來,如果ie訪問的是ie.html這個腳本就不重寫;
rewrite ^.*$ ie.html;
}
```
**Example3**
目錄自動加`/`
```
if (-d $request_filename){
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
```
用([^/])匹配最后一個非'/'的字符,然后自己強行再添加一個'/'($2變量后的那個)
**Example4**
Nginx防盜鏈
```
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.nixi8.com nixi8.com localhost 192.168.42.188; #定義none(空,直接訪問),blocked(被防火墻標記過的來路),nixi8.com的二級域名和一級域名,localhost,192.168.42.188
if ($invalid_referer) { # 如果不是上面定義的其中一個
rewrite ^/ http://www.nixi8.com/none.gif; # 就重寫到一張gif圖片上;
return 412;
break;
}
access_log off; # 關閉日志,降低服務器的損耗
root /opt/lampp/htdocs/web;
expires 3d;
break;
}
```
**Example5**
隱藏index.php
apache下只要在全局配置文件中設置了缺省首頁index.php就能實現直接到達index.php,但是nginx目前默認情況下只能到達index.html而不能訪問到index.php,所以只好rewrite重寫使其支持
```
if (-f $request_filename) { //使其不隱藏index.php的時候也能訪問到
expires max;
break;
}
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
```
- Apache
- 【Apache運維基礎(1)】Apache的安裝與使用
- 【Apache運維基礎(2)】主配置文件說明
- 【Apache運維基礎(3)】虛擬主機配置說明
- 【Apache運維基礎(4)】Apache的Rewrite攻略(1)
- 【Apache運維基礎(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache運維基礎(6)】Apache的日志管理與分析
- 工具篇
- supervisor進程管理器
- Haproxy安裝與配置
- Nginx
- 【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存
- 【nginx網站性能優化篇(2)】反向代理實現Apache與Nginx的動靜分離(LNMPA)
- 【nginx網站性能優化篇(3)】反向代理實現負載均衡
- 【nginx網站性能優化篇(4)】理解nginx的高并發原理及其配置調優
- 【nginx運維基礎(1)】Nginx的編譯安裝與使用
- 【nginx運維基礎(2)】Nginx的配置文件說明及虛擬主機配置示例
- 【nginx運維基礎(3)】Nginx的編譯PHP
- 【nginx運維基礎(4)】Nginx的日志管理(日志格式與定時分割日志)
- 【nginx運維基礎(5)】Nginx的location攻略
- 【nginx運維基礎(6)】Nginx的Rewrite語法詳解
- 【nginx運維基礎(7)】配置SSL支持https訪問
- 【nginx運維基礎(8)】配置支持http2協議
- 【nginx運維基礎(9)】了解PHP-FPM 與 Nginx 的通信機制
- 其它
- Apache與Nginx下php隱藏http頭部版本信息的實現方法
- CURL與PHP-CLI的應用【CLI篇】
- CURL與PHP-CLI的應用【Curl篇】
- Linux之SAMBA共享服務
- 【Linux常識篇(1)】所謂的正向代理與反向代理
- 【Linux常識篇(2)】理解inode
- 【Linux常識篇(3)】文件及文件夾的ctime atime mtime的含義詳解
- centOS使用手記
- 服務器日志分析
- 高頻命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查詢命令
- vi&vim
- ls與目錄結構
- grep
- awk
- sed
- 其他高頻命令