說到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))
';
}