我尝试使用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';
}
}
}
答案 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)
的单个调用进行比较。
因此,确保静态文件的大小写匹配可能比认为更加合理,而不是遭受如此显着的性能下降(并且可能需要为某些类型的缓存提供额外的复杂性。问题)。另一方面,如果您不关心提供静态内容的性能,那么您也可以将静态文件请求代理到另一台支持/鼓励这种低效操作的服务器。