nginx之重寫uri爲全小寫

說到rewrite重寫已是衆所周知的了,可是這裏不單純是rewrite,而是將uri改寫成所有小寫。這要歸責於公司的歷史遺留問題,由於公司要逐步從windows過分到linux,要一會兒所有過分過去是不現實的,由於不單單是架構,還有web應用程序代碼重構。因爲公司流量劇增,iis已經顯得有些吃力,甚至出現錯誤,並且nginx的出現改變了web,因此咱們打算部署nginx服務器,可是因爲當時是用asp開發的基於iis的web應用(我說的是靜態文件,而非asp動態文件,asp在linux上運行也不配套啊,呵呵),因此沒考慮文件和目錄大小寫問題,以致於釀成今日之禍。若是將程序遷移到linux裏nginx上,會出現404,有些文件或目錄沒法訪問,這顯得方案不完美,這種狀況下須要用到第三方nginx模塊Lower Upper Case 或者使用lua腳本php


架構以下:
192.168.18.249 windows iis asp
192.168.18.240 nginx1 前端
192.168.18.241 nginx2 後端,放置靜態文件

一、準備工做
在nginx運行前咱們須要拷貝 文件 ,把windows服務器上的靜態文件拷貝到linux服務器上,同時將文件和目錄所有轉換爲小寫,能夠按以下方法作:
將windows目標目錄共享,在linux下mount, (在192.168.18.241上操做) 如:
[root@vm4 ~]# mount -o username=username,password=pwd //192.168.18.249/c/tmp/webroot /mnt
開始拷貝
[root@vm4 ~]# find /mnt/ | xargs -n1|while read s_name
do
d_name=$(echo /data/webroot/${s_name#/mnt/}|tr 'A-Z' 'a-z')
[ -d "$s_name" ] && install -d "$d_name" && continue
cp $s_name $d_name
chmod 644 $d_name
done
若是沒有錯誤的話,如今本地的文件和目錄應該都是小寫的了,若有更高效的拷貝方法請朋友告知!3ks

二、安裝nginx模塊ngx_http_lower_upper_case (在192.168.18.240上操做)
[root@vm3 ~]# git clone http://github.com/replay/ngx_http_lower_upper_case.git
[root@vm3 ~]# cd nginx-1.2.6
[root@vm3 ~]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --add-module=../ngx_http_lower_upper_case/
[root@vm3 ~]# make
[root@vm3 ~]# make install

三、配置nginx (在192.168.18.240上操做)
[root@vm3 ~]# grep -v '^[[:space:]]*#\|^$' /usr/local/nginx/conf/nginx.conf
[root@vm3 ~]# egrep -v '^[[:space:]]*#|^$' /usr/local/nginx/conf/nginx.conf
user        apache;
worker_processes        1;
events {
               worker_connections        1024;
}
http {
               include                         mime.types;
               default_type        application/octet-stream;
               sendfile                                on;
               keepalive_timeout        65;
               server {
                               listen                         80;
                               server_name        localhost;
                               root         html;
                               index        index.html index.htm;
                               location ~* "\.php$" {
                                 fastcgi_pass 127.0.0.1:9000;
                                 include fastcgi.conf;
                               }
                               location / {
                                 lower $lower_uri "$request_uri";
       rewrite .* $lower_uri break;
       proxy_pass http://192.168.18.241;
                               }
                               error_page         500 502 503 504        /50x.html;
                               location = /50x.html {
                                               root         html;
                               }
               }
}
用-t測試配置文件,啓動或重啓nginx
[root@vm3 ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
四、測試
ok了,如今無論是訪問大寫仍是小寫都沒問題了,大功告成!

若是不用代理,本地也能夠,就是把proxy_pass刪掉便可!html


使用以下lua腳本,也能夠實現:前端

location / {
           proxy_pass http://192.168.18.241;
           rewrite_by_lua '
                ngx.req.set_uri(string.lower(ngx.var.uri))
            ';
}
相關文章
相關標籤/搜索