热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx/Tengine实现网址大小写转换

   最近有一项目需要移植到Linux下,功能简单来讲就是FTP上传+HTTP下载。   由于Windows操作系统中,文件名是不区分大小写的,而Linux系统是大小写敏感,导致对

    最近有一项目需要移植到Linux下,功能简单来讲就是FTP上传+HTTP下载。

    由于Windows操作系统中,文件名是不区分大小写的,而Linux系统是大小写敏感,导致对应开发人员及程序都感冒了!

  解决分3步:

    首先,使用FTP上传时,需要统一大小写。文件名和路径要统一使用大写或小写,推荐用小写。一般主流的FTP工具都支持此类转换:

    Nginx/Tengine实现网址大小写转换

    然后,需要将已上传的目录和文件做一次转换。下例为递归将目录和文件改为小写:

#!/bin/bash
find -exec sh -c 'rm -f "$0" `echo "$0" | tr "[A-Z]" "[a-z]"` > /dev/null 2>&1' {} \;

    最后,在HTTP前端做统一处理,将下载地址进行统一转换。

  转换方法有3种:

    1、使用perl模块(不推荐!Nginx官网已申明perl模块存在内存漏洞的可能,笔者在生产环境中有遇到,推测是在reload时发生的)

user  nobody nobody;
worker_processes  8;
error_log  /data/log/tengine/error.log  error;
pid        /var/run/tengine.pid;

events {
use epoll;
worker_connections  81920;
}

http {
include       mime.types;
default_type  text/plain;
access_log  off;
sendfile        on;
server_tokens off;
keepalive_timeout  120;

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


server {
         listen       80 backlog=8192;
         server_name  _;
         charset utf-8;

         location / {
                 if ($uri ~ [A-Z]){ rewrite ^(.*)$ $url last; }
                 root /usr/share/tengine/html;
                 index  index.html;
         }

         location ~ ^(.*)\/\.(svn|git|hg|bzr|cvs)\/ { deny all; access_log off; log_not_found off; }
  }
}

    2、使用lua模块(推荐!),示例如下:

user  nobody nobody;
worker_processes  8;
error_log  /data/log/tengine/error.log  error;
pid        /var/run/tengine.pid;

events {
use epoll;
worker_connections  81920;
}

dso { # DSO module for Tengine
     load ngx_http_lua_module.so;
}

http {
include       mime.types;
default_type  text/plain;
access_log  off;
sendfile        on;
server_tokens off;
keepalive_timeout  120;

server {
         listen       80 backlog=8192;
         server_name  _;
         charset utf-8;

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

         location ~ ^(.*)\/\.(svn|git|hg|bzr|cvs)\/ { deny all; access_log off; log_not_found off; }
  }
}

    3、使用第3方模块(ngx_http_lower_upper_case),示例如下:

user  nobody nobody;
worker_processes  8;
error_log  /data/log/tengine/error.log  error;
pid        /var/run/tengine.pid;

events {
use epoll;
worker_connections  81920;
}

http {
include       mime.types;
default_type  text/plain;
access_log  off;
sendfile        on;
server_tokens off;
keepalive_timeout  120;

server {
         listen       80 backlog=8192;
         server_name  _;
         charset utf-8;

         location / {
                 if ($uri ~ [A-Z]){
                    lower $url "$uri";
                    rewrite ^(.*)$ $url redirect;
                 }
                 root /usr/share/tengine/html;
                 index  index.html;
         }

         location ~ ^(.*)\/\.(svn|git|hg|bzr|cvs)\/ { deny all; access_log off; log_not_found off; }
  }
}


推荐阅读
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
博艺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有