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