nginx配置⽂件特殊字符说明
开发过程中经常重复配置f,对⾥⾯的特殊字符始终不太明⽩具体的意义,今天百度nginx配置看到⼀篇不错的⽂章,转载记录下来,以备不时之需。
nginx rewrite 正则表达式匹配
⼤⼩写匹配
~ 为区分⼤⼩写匹配
~* 为不区分⼤⼩写匹配
!~和!~*分别为区分⼤⼩写不匹配及不区分⼤⼩写不匹配
⽂件及⽬录匹配
-f和!-f⽤来判断是否存在⽂件
-d和!-d⽤来判断是否存在⽬录
-e和!-e⽤来判断是否存在⽂件或⽬录
-x和!-x⽤来判断⽂件是否可执⾏
flag标记
last 相当于Apache⾥的[L]标记,表⽰完成rewrite
break 终⽌匹配, 不再匹配后⾯的规则。
redirect 返回302临时重定向地址栏会显⽰跳转后的地址。
permanent 返回301永久重定向地址栏会显⽰跳转后的地址。
logcation的⼏个使⽤实例:
1)location  / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
2)location =/ {}:仅仅匹配/
3)location ~* \.(gif|jpg|jpeg)$
rewrite \.(gif|jpg)$ /logo.png;
}:location不区分⼤⼩写,匹配任何以gif,jpg,jpeg结尾的⽂件。
⼏个实例:
多⽬录转成参数
要求:abc.domian/sort/2 => abc.domian/index.php?act=sort&name=abc&id=2
规则配置:
if ($host ~* (.*)\.domain\) {
set $sub_name $1;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}
⽬录对换
要求:/123456/xxxx -> /xxxx?id=123456
规则配置:
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
再来⼀个针对浏览器优化的⾃动rewrite,这⾥rewrite后的⽬录可以是存在的;
例如设定nginx在⽤户使⽤ie的使⽤重定向到/nginx-ie⽬录
规则如下:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
⽬录⾃动加“/” ,这个功能⼀般浏览器⾃动完成
if (-d $request_filename){
}
以下这些可能就跟⼴义的rewrite重写⽆关了
禁⽌htaccess
location ~/\.ht {
deny all;
}
禁⽌多个⽬录
location ~ ^/(cron|templates)/ {
deny all; break;
}
禁⽌以/data开头的⽂件,可以禁⽌/data/下多级⽬录下.等请求
location ~ ^/data {
deny all;
}
禁⽌单个⽂件
location ~ /data/sql/data.sql {
deny all;
}
给favicon.ico和设置过期时间; 这⾥为favicon.ico为99天,为7天并不记录404错误⽇志location ~(favicon.ico) {
log_not_found off;
expires 99d;
break;
}
location ~() {
log_not_found off;
expires 7d;
break;
}
设定某个⽂件的浏览器缓存过期时间;这⾥为600秒,并不记录访问⽇志
location ^~ /html/scripts/loadhead_1.js {
正则匹配一张图片access_log off;
expires 600;
break;
}
Nginx还可以⾃定义某⼀类型的⽂件的保质期时间,具体写法看下⽂的代码:
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires    1h;
break;
}
}
//上段代码就将js|css|jpg|jpeg|gif|png|swf这类⽂件的保质期设置为⼀⼩时。
防盗链的设置:
防盗链:如果你的⽹站是个下载⽹站,下载步骤应该是先经过你的主页到下载地址,才能下载,为了防⽌某些⽹友直接访问下载地址完全不通过主页下载,我们就可以使⽤防盗链的⽅式,具体代码如下:
⽂件反盗链并设置过期时间--<;盗链多次请求也会打开你的站点的图⽚啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图⽚> location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.jjonline *.jjonline *. *. localhost  42.121.107.189;
if ($invalid_referer) {
return 417;
break;
}
access_log off;
break;
}
说明:
这⾥的return 417 为⾃定义的http状态码,默认为403,⽅便通过nginx的log⽂件出正确的盗链的请求地址
“access_log off;”不记录访问⽇志,减轻压⼒
“expires 3d”所有⽂件3天的浏览器缓存
只充许固定ip访问⽹站,并加上密码;这个对有权限认证的应⽤⽐较在⾏
location \ {
allow 22.27.164.25; #允许的ipd
deny all;
auth_basic “KEY”; #认证的⼀些设置
auth_basic_user_file htpasswd;
}
说明:location的应⽤也有各种变化,这⾥的写法就针对了根⽬录了。
⽂件和⽬录不存在的时重定向
if (!-e $request_filename) {
#return 404; #直接返回404码,然后会寻root指定的404.html⽂件
}
域名跳转
server {
listen 80;
server_name jump.jjonline ;#需要跳转的多级域名
index index.html index.htm index.php; #⼊⼝索引⽂件的名字
root /var/www/public_html/; #这个站点的根⽬录
#rewrite到这个地址,功能表现:在浏览器上输⼊jump.jjonline并回车,不会有任何提⽰直接变成www.jjonline    access_log off;
}
多域名转向
server {
listen 80;
server_name www.jjonline ;
index index.html index.htm index.php;
root /var/www/public_html/;
if ($host ~ “jjonline\.org”) {
}
}
三级域名跳转
if ($http_host ~* “^(.*)\.i\.jjonline\$”) {
break;
}
域名镜向
server {
listen 80;
server_name mirror.jjonline;
index index.html index.htm index.php;
root /var/www/public_html;
access_log off;
}
某个⼦⽬录作镜向,这⾥的⽰例是demo⼦⽬录
location ^~ /demo {
break;
}
以下在附带本博客的rewrite写法,emlog系统的rewrite
location ~ {
if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php last;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。