原文地址:http://blog.linuxeye.com/382.html

如果你将跑在Windows下的项目(如:php)迁移到Linux下,由于Windows操作系统中,文件名是不区分大小写的;而Linux系统是大小写敏感,会导致有些网页出现404情况。

解决方法有大概4种:
1、 url rewrite
2、 perl模块
3、 lua模块
4、 ngx_http_lower_upper_case

第一种方法适用于有规则的或者较少的url需要转换,如果有大量并无规则的请用下面几种方法

第二、三、四种方法前提是Linux系统本地文件是小写,原理是将url请求转换成小写来处理

perl模块(不推荐!Nginx官网已申明perl模块存在内存漏洞的可能),方法如下(《lnmp一键安装包》安装后执行下面):

cd lnmp/src/nginx-1.4.4
make clean #清除已经编译出的nginx# /usr/local/nginx/sbin/nginx -V #获取已编译参数
nginx version: nginx/1.4.4
built by gcc 4.4.720120313(RedHat4.4.7-3)(GCC)
TLS SNI support enabled
configure arguments:--prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt='-ljemalloc'

在已经编译的参数后面加上 –with-http_perl_module ,如下:

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module \
--with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt='-ljemalloc' \
--with-http_perl_module

可能会报如下错误:

Can't locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted. ./configure: error: perl module ExtUtils::Embed is required

解决方法(CentOS):

yum -y install perl-devel perl-ExtUtils-Embed

再次编译:

make clean
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module \
--with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt='-ljemalloc' \
--with-http_perl_module
make
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx$(date +%m%d)#备份nginx原文件
service nginx stop
make install #直接安装,如果只覆盖nginx,会有报错/usr/local/nginx/sbin/nginx -t

修改配置主文件(/usr/local/nginx/conf/nginx.conf):

        perl_set $url '
sub {
my $r = shift;
my $re = lc($r->uri);
return $re;
}
';

修改虚拟主机配置文件(如:/usr/local/nginx/conf/vhost/demo.linuxeye.com.conf):

if($uri ~[A-Z]){
rewrite ^(.*)$ $url last;}

lua模块(推荐!)
lua-nginx-module来自大牛agentzh的开源项目,在Nginx中嵌入Lua语言,使之可以支持强大Lua语法,如下:

cd lnmp/src
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz #ngx_devel_kit
wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.9.2.tar.gz #nginx_lua_module
tar xzf LuaJIT-2.0.2.tar.gz
tar xzf v0.2.19.tar.gz
tar xzf v0.9.2.tar.gz
cd LuaJIT-2.0.2
make && make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
cd nginx-1.4.4
make clean #清除已经编译出的nginx# /usr/local/nginx/sbin/nginx -V #获取已编译参数
nginx version: nginx/1.4.4
built by gcc 4.4.720120313(RedHat4.4.7-3)(GCC)
TLS SNI support enabled
configure arguments:--prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt='-ljemalloc'

重新编译Nginx

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module \
--with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt=-ljemalloc \
--add-module=../lua-nginx-module-0.9.2--add-module=../ngx_devel_kit-0.2.19
make
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx$(date +%m%d)#备份nginx原文件
service nginx stop
make install #直接安装,如果只覆盖nginx,可能会报错
ldconfig #重新读取库文件,否则报错/usr/local/nginx/sbin/nginx -t

修改配置文件(如:/usr/local/nginx/conf/vhost/demo.linuxeye.com.conf):

location /{if($uri ~[A-Z]){
rewrite_by_lua 'return ngx.redirect(string.lower(ngx.var.uri),ngx.HTTP_MOVED_PERMANENTLY)';}}

ngx_http_lower_upper_case模块
参考:https://github.com/replay/ngx_http_lower_upper_case

Nginx实现url请求不区分大小写的更多相关文章

  1. nginx的URL重写应用实例

    1,NGINx的URL重写 NGINX 的URL重写模块用的比较多,主要使用的命令有if rewrite set break 2 if命令 语法如下"" 语法:if(conditi ...

  2. 4.Nginx的URL重写应用

    Nginx的URL重写应用 nginx的URL重写模块是用得比较多的模块之一,所以我们需要好好地掌握运用.常用的URL重写模块命令有if,rewrite,set,break等. if命令 if用于判断 ...

  3. Nginx实现URL重写

    本文利用Nginx实现URL重写,本文使用Nginx与静态页面配合重写URL. 1.准备工作. 结合本文场景,需要安装Nginx. 1.1 关于Linux系统安装Nginx可以参考我的文章---(传送 ...

  4. (Nginx) URL REWRITE

    URL重写的基础介绍 把URI地址用作参数传递:URL REWRITE 最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换: 这样几乎可以不修改程序的实现将 news. ...

  5. 简明 Nginx Location Url 配置笔记

    基本配置 为了探究nginx的url配置规则,当然需要安装nginx.我使用了vagrant创建了一个虚拟环境的ubuntu,通过apt-get安装nginx.这样就不会污染mac的软件环境.通过vr ...

  6. nginx实时记录请求状态信息( ngx_realtime_request_module)

    cd /usr/local/src/ wget "http://nginx.org/download/nginx-1.4.2.tar.gz" tar -xzvf nginx.tar ...

  7. 转发URL请求

    如何用Netty实现一个轻量级的HTTP代理服务器 - Newland - 博客园 https://www.cnblogs.com/jietang/p/8926325.html 现在迫切希望有一个HT ...

  8. 【Nginx】HTTP请求的11个处理阶段

    Nginx将一个HTTP请求分成多个阶段.以模块为单位进行处理.这样做的优点是使处理过程更加灵活.减少耦合度.HTTP框架将处理分成了11个阶段,各个阶段能够包括随意多个HTTP模块并以流水线的方式处 ...

  9. 万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段

    Nginx 处理一个 HTTP 请求的全过程 前面给大家讲了 Nginx 是如何处理 HTTP请求头部的,接下来就到了真正处理 HTTP 请求的阶段了.先看下面这张图,这张图是 Nginx 处理 HT ...

随机推荐

  1. 多线程中实现ApplicationContextAware接口获取需要的bean,applicationContext.getBea未返回也未报错

    唉,面试失败了有点难过. https://q.cnblogs.com/q/95168/#a_208239

  2. python全栈开发知识点补充for else和while else如果不是除正常以外的其他方式退出循环,那么else语句就会被执行。

    如果不是除正常以外的其他方式退出循环,那么else语句就会被执行. 也就是循环体内没有break语句.return语句.和其他异常语句的执行. for   else >>> for ...

  3. 【Java】 剑指offer(53-3) 数组中数值和下标相等的元素

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程 ...

  4. 在storm中运行jar产生模拟数据的时候,遇见的问题

    1.问题由来 命令:java -jar data.jar 1000 >>nginx.log 报错: Exception in thread "main" java.la ...

  5. eric6中ui文件编译失败,提示找不到puicc5

    1解决办法 在setting中——preference 找到qt设置——pyQT工具文件选择更改为: 我的pyuicc5.exe文件在这个目录下 然后右击编译窗口,就成功了. 如果找不到ui文件,在窗 ...

  6. symmfony

    安装:http://symfony.cn/docs/book/installation.html 1先检查php版本是否符合你要下载的symfony的最低版本: php -version 系统安装完成 ...

  7. 《Gradle权威指南》--Android Gradle高级自定义

    No1: 指定共享库 <uses-library android:name="com.google.android.maps" android:required=" ...

  8. MAC下通过改apache配置文件切换php多版本的方法

    网上关于php版本切换的文章有很多,但测试发现有很多都不行,所以不如自己想办法实现了,所以下面这篇文章主要给大家介绍了在MAC系统下通过改apache配置文件的方法来使php多版本切换的相关资料,需要 ...

  9. 洛谷 P1757 通天之分组背包 【分组背包】

    题目链接:https://www.luogu.org/problemnew/show/P1757#sub 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包 ...

  10. P2393 yyy loves Maths II

    P2393 yyy loves Maths IIlong double比如保留5位小数*1000000都变成整数最后再/1000000避免精度误差scanf("%Lf",& ...