如何使用nginx不区分大小写地提供静态文件?

时间:2015-07-30 15:31:08

标签: nginx

我尝试使用nginx提供静态文件,并且我已经尝试将~*添加到位置选项中,但这似乎不适用于我所做的事情。\#39 ; m尝试这样做:提供不区分大小写的文件。现在,如果URL的大小写与文件系统中文件的名称不匹配,我会得到404。

例如,我有一个文件/usr/share/nginx/psimages/scripts/ajaxprogress.js,我可以通过转到/scripts/ajaxprogress.js网址来访问它,但我还需要访问/scripts/AjaxProgress.js来访问它,当我尝试加载它时,目前给出了404错误。

这是我的配置:

server {
    error_log /var/log/nginx/ngerror.log debug;
    listen 80 default_server;
    listen [::]:80 default_server;

    root /usr/share/nginx/psimages;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location ~* / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules

            # Wide-open CORS config for nginx
        if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
         }
         if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
         }
         if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
         }
    }
}

2 个答案:

答案 0 :(得分:4)

来自权威World Wide Web Consortium specifications的网址:

  

URL通常区分大小写(机器名称除外)。可能存在URL或URL的一部分,其中大小写无关紧要,但识别这些可能并不容易。用户应始终认为URL区分大小写。

机器名称是免除的,因为Domain Name System具有长的先前定义的名称在§2.3.1中不区分大小写。

如果没有极其令人信服的理由,您不应违反w3.org规范,因为您永远不知道它会产生什么副作用。

例如,使用区分大小写的URL可能会混淆可能无法区分tools:replace="label, icon"ThisFile.html(或该名称的144个案例变体)的缓存代理。因为,根据定义,你应该永远不知道你是否已经找到了一个缓存代理,或者它们中有多少,很可能会产生错误的文档。

答案 1 :(得分:1)

使用股票nginx无法做到这一点。

我认为这个想法是你最好知道文件的名称是什么。进行不区分大小写的文件搜索需要读取和遍历整个目录结构(例如,使用readdir(3)),将每个文件条目与输入进行比较。想象一下,该目录中有1k个文件;然后,这导致对这些1k文件中的一半进行不区分大小写的比较,这对于单个请求的静态文件来说是非常低效的(如果目录本身必须是重复和相乘的话)不区分大小写的搜索。当文件(具有正确的大小写和路径)已知时,将其与open(2)的单个调用进行比较。

因此,确保静态文件的大小写匹配可能比认为更加合理,而不是遭受如此显着的性能下降(并且可能需要为某些类型的缓存提供额外的复杂性。问题)。另一方面,如果您不关心提供静态内容的性能,那么您也可以将静态文件请求代理到另一台支持/鼓励这种低效操作的服务器。