<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rising Sun

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks

    最近在VPS上嘗試配置安裝一個網站,VPS安裝了LNMP(Linux+Nginx+MySQL+php)在配置重定規則的時候經常遇到一些問題,直接用Apache的規則到Nginx下沒起作用。原來Apache 重寫的規則到nginx上還有一些不太一樣的地方。

    這里只是簡單記錄一些學習示例,高手略過,新手可以看一下。

    Nginx Rewrite規則相關指令
    Nginx Rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的Nginx Rewrite規則語法如下:

    rewrite ^/b/(.*)\.html /play.php?video=$1 break;

    如果加上if語句,示例如下:

    if (!-f $request_filename)

    rewrite ^/img/(.*)$ /site/$host/images/$1 last;

    Nginx與Apache的Rewrite規則實例對比

    簡單的Nginx和Apache 重寫規則區別不大,基本上能夠完全兼容。例如:

    Apache Rewrite 規則:

    RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

    RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

    RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]

    RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]

    Nginx Rewrite 規則:

    rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

    rewrite ^/ceshi/$ /zl/ceshi.php last;

    rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

    rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;

    由以上示例可以看出,Apache的Rewrite規則改為Nginx的Rewrite規則,其實很簡單:Apache的RewriteRule指令換成Nginx的rewrite指令,Apache的[L]標記換成Nginx的last標記,中間的內容不變。

    如果Apache的Rewrite規則改為Nginx的Rewrite規則后,使用nginx -t命令檢查發現nginx.conf配置文件有語法錯誤,那么可以嘗試給條件加上引號。例如一下的Nginx Rewrite規則會報語法錯誤:

    rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;

    加上引號就正確了:
    rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;

    Apache與Nginx的Rewrite規則在URL跳轉時有細微的區別:

    Apache Rewrite 規則:
    RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]

    Nginx Rewrite 規則:
    rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;

    以上示例中,我們注意到,Nginx Rewrite 規則的置換串中增加了“http://$host”,這是在Nginx中要求的。

    另外,Apache與Nginx的Rewrite規則在變量名稱方面也有區別,例如:

    Apache Rewrite 規則:
    RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]

    Nginx Rewrite 規則:
    rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host   last;

    Apache與Nginx Rewrite 規則的一些功能相同或類似的指令、標記對應關系:

    Apache的RewriteCond指令對應Nginx的if指令;
    Apache的RewriteRule指令對應Nginx的rewrite指令;
    Apache的[R]標記對應Nginx的redirect標記;
    Apache的[P]標記對應Nginx的last標記;
    Apache的[R,L]標記對應Nginx的redirect標記;
    Apache的[P,L]標記對應Nginx的last標記;
    Apache的[PT,L]標記對應Nginx的last標記;

    允許指定的域名訪問本站,其他域名一律跳轉到http://www.aaa.com

    Apache Rewrite 規則:
    RewriteCond %{HTTP_HOST}    ^(.*?)\.domain\.com$
    RewriteCond %{HTTP_HOST}    !^qita\.domain\.com$
    RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
    RewriteRule ^/wu/$ /market/%1/index.htm [L]

    Nginx的if指令不支持嵌套,也不支持AND、OR等多條件匹配,相比于Apache的RewriteCond,顯得麻煩一些,但是,我們可以通過下一頁的Nginx配置寫法來實現這個示例:

    Nginx Rewrite 規則:
    if ($host ~* ^(.*?)\.domain\.com$) set $var_wupin_city $1;
         set $var_wupin ‘1′;

    if ($host ~* ^qita\.domain\.com$)

        set $var_wupin ‘0′;

     if (!-f $document_root/market/$var_wupin_city/index.htm)

         set $var_wupin ‘0′;

    if ($var_wupin ~ ‘1′)

        rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
    }

     

    rewrite 的語法

     

    語法: rewrite regex replacement flag

    默認: none

    作用域: server, location, if

    This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.

    這個指令根據表達式來更改URI,或者修改字符串。指令根據配置文件中的順序來執行。

    Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:

    注意重寫表達式只對相對路徑有效。如果你想配對主機名,你應該使用if語句。

    rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,因此這里的if規則里面,你無需關心用戶在瀏覽器里輸入的參數,rewrite后會自動添加的因此,我們只是加上了一個?號和后面我們想要的一個小小的參數 ***https=1就可以了。

    nginx的rewrite規則參考:

    1. ~ 為區分大小寫匹配
    2. ~* 為不區分大小寫匹配
    3. !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹
    1. -f和!-f用來判斷是否存在文件
    2. -d和!-d用來判斷是否存在目錄
    3. -e和!-e用來判斷是否存在文件或目錄
    4. -x和!-x用來判斷文件是否可執行
    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&amp;controller=$1&amp;action=$2&amp;$3 last;
    3. rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&amp;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. location ~(robots.txt) {
    7. log_not_found off;
    8. expires 7d;
    9. break;
    10. }

    設定某個文件的過期時間;這里為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.divmy.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.divmy.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.88dgw.com;
    5. index index.html index.htm index.php;
    6. root  /opt/lampp/htdocs/www;
    7. rewrite ^/ http://www.88dgw.com/;
    8. access_log  off;
    9. }

    多域名轉向

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

    三級域名跳轉

    1. if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) {
    2. rewrite ^(.*) http://top.88dgw.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.divmy.com/$1 last;
    8. access_log  off;
    9. }

    某個子目錄作鏡向

    1. location ^~ /zhaopinhui {
    2. rewrite ^.+ http://zph.divmy.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. location = / {
    3. if ($http_host ~ news\.divmy.com$) {
    4. rewrite ^.+ http://news.divmy.com/forum-831-1.html last;
    5. break;
    6. }
    7. }

    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. location /ucenter/data/avatar {
    10. log_not_found off;
    11. access_log   off;
    12. location ~ /(.*)_big\.jpg$ {
    13. error_page 404 /ucenter/images/noavatar_big.gif;
    14. }
    15. location ~ /(.*)_middle\.jpg$ {
    16. error_page 404 /ucenter/images/noavatar_middle.gif;
    17. }
    18. location ~ /(.*)_small\.jpg$ {
    19. error_page 404 /ucenter/images/noavatar_small.gif;
    20. }
    21. expires 300;
    22. break;
    23. }
    24. }

    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. location ~* ^/index.php/
    9. {
    10. rewrite ^/index.php/(.*) /index.php?$1 break;
    11. fastcgi_pass  127.0.0.1:9000;
    12. fastcgi_index index.php;
    13. include fcgi.conf;
    14. }

    另外這里還有一個工具可以直接把apache規則轉化為nginx規則

    http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

    參考:

    http://wiki.nginx.org/NginxChsHttpRewriteModule

    http://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx

    http://www.divmy.com/
    posted on 2012-07-11 09:47 brock 閱讀(4299) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV无码国产丝袜在线观看| 久久综合久久综合亚洲| 亚洲日韩精品一区二区三区无码| 精品亚洲国产成AV人片传媒| 亚洲日韩精品无码AV海量| 中文字幕免费在线视频| 性做久久久久久久免费看| 亚洲人午夜射精精品日韩| 亚洲xxxx18| 久久久久国色av免费看| mm1313亚洲精品无码又大又粗| 久久久久久亚洲AV无码专区| 99精品热线在线观看免费视频| 亚洲国产精品日韩专区AV| 亚洲乱码在线观看| 成人黄软件网18免费下载成人黄18免费视频| 成人亚洲性情网站WWW在线观看| 亚洲精品国产suv一区88 | 免费人成动漫在线播放r18| 亚洲w码欧洲s码免费| 久久夜色精品国产亚洲| 免费高清A级毛片在线播放| 亚洲日韩激情无码一区| 日韩人妻一区二区三区免费| 久久亚洲最大成人网4438| 国产免费怕怕免费视频观看| 久久精品国产亚洲AV| 国产成人免费AV在线播放| 中文字幕视频免费| 亚洲国产精品一区二区第一页| 久久午夜夜伦鲁鲁片无码免费| 亚洲人成亚洲人成在线观看| 91在线老王精品免费播放| 亚洲人成网站免费播放| 亚洲国产主播精品极品网红| 日本亚洲中午字幕乱码 | 777成影片免费观看| 亚洲色一区二区三区四区| 黄色片在线免费观看| 亚洲人成网站色在线观看| 国产专区一va亚洲v天堂|