nginx: http_core_module
目录
语法 | default_type mime-type; |
默认 | default_type text/plain; |
环境 | http, server, location |
定义响应的默认MIME类型。
可以通过 types 指令来映射MIME类型。
语法 | root path; |
默认 | root html; |
环境 | http, server, location, if in location |
设置请求的根目录。
最终所请求的文件路径只是把“root”指令的值加在URI后面而已。如果需要改变URI,可以使用别名指令“alias”。
对于以下例子:
location /i/ {
root /data/w3;
}
,将发送文件“/data/w3/i/top.gif”用于响应请求“/i/top.gif”。
path 可以包含除“$documment_root”、“$realpath_root”之外的变量。
语法 | server { ... } |
默认 | |
环境 | http |
配置虚拟服务器(块)。
在块内,可以通过 listen 指定监听的端口,通过 server_name 列出该server适用的所有服务器的主机(名)。
语法 | server_name name ...; |
默认 | server_name ""; |
环境 | server |
设置虚拟服务器的名字。
举例:
server {
server_name example.com www.example.com;
}
第1个名字将作为主要的服务器名字。服务器名字可以包含用于替换名字第1部分或最后一部分的通配符“*”:
server {
server_name example.com *.example.com www.example.*;
}
前两者也可以合并成一个:
server {
server_name .example.com;
}
同样可以在名字中使用正则表达式,只需要在名字前面加上一个波浪线即可:
server {
server_name www.example.com ~^www\d+\.example\.com$;
}
正则表达式式中可以包含变量捕捉组,用于后续的使用:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
server {
server_name _;
location / {
root /sites/default;
}
}
捕捉组也可以有名字,同样用于在其它指令中使用该名字的变量值:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
server {
server_name _;
location / {
root /sites/default;
}
}
如果该指令的参数被设置为“$hostname”,那么server的名字就是当前主机的名字。
服务器的名字也可以是空的:
server {
server_name www.example.com "";
}
它允许当前虚拟服务器代替默认虚拟服务器去处理那些没有 “Host” HTTP头的请求。
在通过请求的Host搜索该使用哪个虚拟服务器时,如果同时出现多个匹配(比如:含通配符的和正则的),ngx将按照以下顺序选择该使用哪一个服务器:
- 精确的名字
- 以“*”开始的最长的通配符名字,比如:*.example.com
- 以“*”结束的最长的通配符名字,比如:mail.*
- 第1个匹配的正则表达式(按出现在配置文件中的顺序)
更详细的文档被单独列于:Server Names
语法 | try_files file ... uri; try_files file ... =code; |
默认 | |
环境 | server, location |
每处理一个请求时,按“try_files”参数列出的顺序依次检测该文件是否存在,并把第1个找到的文件用于请求处理。该请求于当前环境中被处理。文件的路径同样是根据“root”或“alias”来构造的。也可以通过在文件名的前面加一个斜杠(/)来检测目录是否存在。如果所有被检测的文件都不存在,则程序内部将重定向到最后一个参数的 uri 或 code。
比如:
location /images/ {
try_files $uri /images/default.gif;
}
location = /images/default.gif {
expires 30s;
}
最后一个参数还可以是一个HTTP状态码code,像下面那样:
location / {
try_files $uri $uri/index.html $uri.html =404;
}
也可以是一个“具名的”位置:
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html
@mongrel;
}
location @mongrel {
proxy_pass http://mongrel;
}
而我处理WordPress中“友好”博客地址的方式是这样的:
location / {
try_files $uri $uri/ /index.php;
}
我这篇文章的 $uri 是“/nginx/http/core.html”,而实际上这个文件是不存在的,真正的请求则被nginx处理成了:/index.php了。
有人可能会纳闷,这样的话,岂不是所有的请求都一样了吗?其实不然。因为“/index.php”是存在于当前博客的目录下面的,在把当前请求转到index.php时,由于协议(fastcgi),index.php中的程序可以通过“$_SERVER['REQUEST_URI']”来取得真正的URI,也就是:/nginx/http/core.html,然后通过此参数的值作文章查找处理。
现在知道WordPress的文章别名为什么能正常工作了吗?语法 | types { ... } |
默认 |
types { text/html html; image/gif gif; image/jpeg jpg; } |
环境 | http, server, location |
映射文件扩展名到请求响应的MIME类型。
注:可能某些人不知道MIME有啥用?举个简单的例子吧!有时候你可能纳闷,为什么我请求“/path/file.zip”的时候浏览器却直接在浏览器窗口中显示该文件的内容(一堆乱码),而不是弹出“另存为”的框框呢?原因很可能就是MIME类型指定错误。对于zip/rar等格式的文件默认应该使用“application/octet-stream”类型。如果要直接在浏览器中显示(比如文本文件),则应设置为“text/plain”。而且nginx的默认类型(default_type)就是text/plain。
扩展名区分大小写。多个扩展名可以映射到一种MIME类型:
types {
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
}
nginx 本身也维护了一个更完整的MIME映射表,位于(conf/mime.types),你也可以直接修改它。
如果要使某“location”下面的所有请求都作为“application/octet-stream”,可以按照类似下面这种方式配置:
location /download/ {
types { }
default_type application/octet-stream;
}