nginx rewrite 參數和例子

正則表達式匹配,其中:

  1. * ~ 爲區分大小寫匹配
  2. * ~* 爲不區分大小寫匹配
  3. * !~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配

文件及目錄匹配,其中:

  1. * -f和!-f用來判斷是否存在文件
  2. * -d和!-d用來判斷是否存在目錄
  3. * -e和!-e用來判斷是否存在文件或目錄
  4. * -x和!-x用來判斷文件是否可執行

flag標記有:

  1. * last 相當於Apache裏的[L]標記,表示完成rewrite
  2. * break 終止匹配, 不再匹配後面的規則
  3. * redirect 返回302臨時重定向 地址欄會顯示跳轉後的地址
  4. * permanent 返回301永久重定向 地址欄會顯示跳轉後的地址

一些可用的全局變量有,可以用做條件判斷(待補全)

  1. $args
  2. $content_length
  3. $content_type
  4. $document_root
  5. $document_uri
  6. $host
  7. $http_user_agent
  8. $http_cookie
  9. $limit_rate
  10. $request_body_file
  11. $request_method
  12. $remote_addr
  13. $remote_port
  14. $remote_user
  15. $request_filename
  16. $request_uri
  17. $query_string
  18. $scheme
  19. $server_protocol
  20. $server_addr
  21. $server_name
  22. $server_port
  23. $uri

結合QeePHP的例子

  1. if (!-d $request_filename) {
  2. rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
  3. rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;
  4. break;

多目錄轉成參數
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

  1. if ($host ~* (.*)\.domain\.com) {
  2. set $sub_name $1;
  3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
  4. }

目錄對換
/123456/xxxx -> /xxxx?id=123456

  1. rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:

  1. if ($http_user_agent ~ MSIE) {
  2. rewrite ^(.*)$ /nginx-ie/$1 break;
  3. }

目錄自動加“/”

  1. if (-d $request_filename){
  2. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  3. }

禁止htaccess

  1. location ~/\.ht {
  2. deny all;
  3. }

禁止多個目錄

  1. location ~ ^/(cron|templates)/ {
  2. deny all;
  3. break;
  4. }

禁止以/data開頭的文件
可以禁止/data/下多級目錄下.log.txt等請求;

  1. location ~ ^/data {
  2. deny all;
  3. }

禁止單個目錄
不能禁止.log.txt能請求

  1. location /searchword/cron/ {
  2. deny all;
  3. }

禁止單個文件

  1. location ~ /data/sql/data.sql {
  2. deny all;
  3. }

給favicon.ico和robots.txt設置過期時間;
這裏爲favicon.ico爲99天,robots.txt爲7天並不記錄404錯誤日誌

  1. location ~(favicon.ico) {
  2. log_not_found off;
  3. expires 99d;
  4. break;
  5. }
  6.  
  7. location ~(robots.txt) {
  8. log_not_found off;
  9. expires 7d;
  10. break;
  11. }

設定某個文件的過期時間;這裏爲600秒,並不記錄訪問日誌

  1. location ^~ /html/scripts/loadhead_1.js {
  2. access_log off;
  3. root /opt/lampp/htdocs/web;
  4. expires 600;
  5. break;
  6. }

文件反盜鏈並設置過期時間
這裏的return 412 爲自定義的http狀態碼,默認爲403,方便找出正確的盜鏈的請求
“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”顯示一張防盜鏈圖片
“access_log off;”不記錄訪問日誌,減輕壓力
“expires 3d”所有文件3天的瀏覽器緩存

  1. location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
  2. valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
  3. if ($invalid_referer) {
  4. rewrite ^/ http://leech.c1gstudio.com/leech.gif;
  5. return 412;
  6. break;
  7. }
  8. access_log off;
  9. root /opt/lampp/htdocs/web;
  10. expires 3d;
  11. break;
  12. }

只充許固定ip訪問網站,並加上密碼

  1. root /opt/htdocs/www;
  2. allow 208.97.167.194;
  3. allow 222.33.1.2;
  4. allow 231.152.49.4;
  5. deny all;
  6. auth_basic “C1G_ADMIN”;
  7. auth_basic_user_file htpasswd;

將多級目錄下的文件轉成一個文件,增強seo效果
/job-123-456-789.html 指向/job/123/456/789.html

  1. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

將根目錄下某個文件夾指向2級目錄
如/shanghaijob/ 指向 /area/shanghai/
如果你將last改成permanent,那麼瀏覽器地址欄顯是/location/shanghai/

  1. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

上面例子有個問題是訪問/shanghai 時將不會匹配

  1. rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
  2. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,
如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導至無法訪問。

那我加上自動跳轉也是不行咯
(-d $request_filename)它有個條件是必需爲真實目錄,而我的rewrite不是的,所以沒有效果

  1. if (-d $request_filename){
  2. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  3. }

知道原因後就好辦了,讓我手動跳轉吧

  1. rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;
  2. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

文件和目錄不存在的時候重定向:

  1. if (!-e $request_filename) {
  2. proxy_pass http://127.0.0.1;
  3. }

域名跳轉

  1. server
  2. {
  3. listen 80;
  4. server_name jump.c1gstudio.com;
  5. index index.html index.htm index.php;
  6. root /opt/lampp/htdocs/www;
  7. rewrite ^/ http://www.c1gstudio.com/;
  8. access_log off;
  9. }

多域名轉向

  1. server_name www.c1gstudio.com www.c1gstudio.net;
  2. index index.html index.htm index.php;
  3. root /opt/lampp/htdocs;
  4. if ($host ~ “c1gstudio\.net”) {
  5. rewrite ^(.*) http://www.c1gstudio.com$1 permanent;
  6. }

三級域名跳轉

  1. if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) {
  2. rewrite ^(.*) http://top.yingjiesheng.com$1;
  3. break;
  4. }

域名鏡向

  1. server
  2. {
  3. listen 80;
  4. server_name mirror.c1gstudio.com;
  5. index index.html index.htm index.php;
  6. root /opt/lampp/htdocs/www;
  7. rewrite ^/(.*) http://www.c1gstudio.com/$1 last;
  8. access_log off;
  9. }

某個子目錄作鏡向

  1. location ^~ /zhaopinhui {
  2. rewrite ^.+ http://zph.c1gstudio.com/ last;
  3. break;
  4. }

discuz ucenter home (uchome) rewrite

  1. rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last;
  2. rewrite ^/(space|network)\.html$ /$1.php last;
  3. rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

discuz 7 rewrite

  1. rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
  2. rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
  3. rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last;
  4. rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
  5. rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
  6. rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

給discuz某版塊單獨配置域名

  1. server_name bbs.c1gstudio.com news.c1gstudio.com;
  2.  
  3. location = / {
  4. if ($http_host ~ news\.c1gstudio.com$) {
  5. rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last;
  6. break;
  7. }
  8. }

discuz ucenter 頭像 rewrite 優化

  1. location ^~ /ucenter {
  2. location ~ .*\.php?$
  3. {
  4. #fastcgi_pass unix:/tmp/php-cgi.sock;
  5. fastcgi_pass 127.0.0.1:9000;
  6. fastcgi_index index.php;
  7. include fcgi.conf;
  8. }
  9.  
  10. location /ucenter/data/avatar {
  11. log_not_found off;
  12. access_log off;
  13. location ~ /(.*)_big\.jpg$ {
  14. error_page 404 /ucenter/p_w_picpaths/noavatar_big.gif;
  15. }
  16. location ~ /(.*)_middle\.jpg$ {
  17. error_page 404 /ucenter/p_w_picpaths/noavatar_middle.gif;
  18. }
  19. location ~ /(.*)_small\.jpg$ {
  20. error_page 404 /ucenter/p_w_picpaths/noavatar_small.gif;
  21. }
  22. expires 300;
  23. break;
  24. }
  25. }

jspace rewrite

  1. location ~ .*\.php?$
  2. {
  3. #fastcgi_pass unix:/tmp/php-cgi.sock;
  4. fastcgi_pass 127.0.0.1:9000;
  5. fastcgi_index index.php;
  6. include fcgi.conf;
  7. }
  8.  
  9. location ~* ^/index.php/
  10. {
  11. rewrite ^/index.php/(.*) /index.php?$1 break;
  12. fastcgi_pass 127.0.0.1:9000;
  13. fastcgi_index index.php;
  14. include fcgi.conf;
  15. }

Related posts:

  1. Discuz在Nginx下的rewrite配置
  2. 使用Nginx的proxy_cache緩存功能取代Squid
  3. 自動將Apache Rewrite僞靜態規則轉換爲Nginx Rewrite
  4. Nginx的一個404設置方法
  5. Nginx的防盜鏈設置
  6. Nginx 0.8.30 發佈
  7. nginx的web反向代理配置
  8. 用apache做反向代理實例
  9. Nginx的重啓等命令
  10. Windows7硬盤安裝最簡單的問題
  11. 關於Nginx和Nginx Fan
  12. Linux系統修改root的密碼
  13. Nginx圖片服務器的架構方案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章