澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:基础及实例,幸免盗链

2019-09-28 作者:澳门新萄京官方网站   |   浏览(62)

1.测试盗链(www.html2.com 盗取 www.html5.com的图片)

nginx rewrite 正则表达式匹配

澳门新萄京官方网站 1

Rewrite重写是基于ngx_http_rewrite_module的,在编辑重写之前,请确保安装了此模块

nginx重写规则

澳门新萄京官方网站 2

大小写匹配

一、ngx_http_rewrite_module
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换

1、 rewrite regex replacement [flag]
2、 return 
3、 rewrite_log on | off;
4、 set $variable value;
5、 if (condition) { ... }

一、nginx的全局变量

1、以http://www.yllin.com:5055/user/index?id=1&type=3为例

变量名 说明 例子
$args Url中的请求参数 id=1&type=3
$content_length 请求头中的Content-length字段
$content_type 请求头中的Content-type字段
$document_root 请求的根路径
$document_uri 当前的url(不包括请求参数) /user/index
$host 主机字段 www.yllin.com
$http_user_agent 请求的客户端的用户代理信息
$http_cookie 客户端的cookie信息
$limit_rate Nginx对网络连接速率的限制(Nginx配置limit_rate指令的配置值 )
$remote_addr 客户端的地址
$remote_port 客户端和服务端的连接端口
$remote_user 客户端的用户名
$request_body_file 发送给服务端的文件资源名称
$request_method 客户端的请求方式 如post、get
$request_filename 资源文件的路径名
$request_uri 请求的url,附带参数 /user/index?id=1&type=3
$query_string 与args同种意义
$scheme 请求协议 http、ftp
$server_protocol 协议版本
$server_addr 服务器ip
$server_name 服务器名字
$server_port 服务器端口
$uri 资源文件的路径名

nginx rewrite 正则表达式匹配

 

~ 为区分大小写匹配 

二、ngx_http_referer_module
1、 valid_referers none|

二、if指令

格式:

if (text-do){
    ...(这里存放配置)
}

当text-do为真的时候,执行里面的括号里面的配置(注意:括号与前面的if之间需保持一个空格,有的时候可能会报错)
看以下几个例子
1、可以用=和!=来比较变量和字符串

if ($request_method = GET){
    return 503;
}

2、可以使用正则来匹配处理,~ 代表的区分大小写 ~* 不区分大小写 !~ 表示区分大小写并把匹配结果取反;同理,!~*表示不区分大小写并把最终匹配结果取反,可以用小括号捕获值,还可以用$1...$9来得到对应值

if($http_user_agent ~ MSIE) {
    ## 检测浏览器用户代理是否包含MSIE这个字符串
}


if($http_cookie ~* "id=([^;] )(?:|$)"){
    ## Nginx 配置,可以使用$1, $2来获取对应匹配的值,如
    ## set $id $1;         将捕获的结果保存在$id中,以便后续使用
}

3、请求资源文件
···
if(-e $request_filename)
## 判断请求文件或者目录是否存在
}

变量名 说明 例子
-f 判断请求的文件是否存在,如果存在,则为true;在其前加上"!"即表示取反 id=1&type=3
-d 请求的目录是否存在;在其前加上"!"即表示取反
-e 判断请求的目录或文件是否存在,如果存在,则为true。
-x 判断当前请求文件是否为可执行文件。

if(!-e $request_filename){
## 判断请求的文件或者目录是否不存在
}
···

变量名 说明 例子
-f 判断请求的文件是否存在,如果存在,则为true;在其前加上"!"即表示取反 id=1&type=3
-d 请求的目录是否存在;在其前加上"!"即表示取反
-e 判断请求的目录或文件是否存在,如果存在,则为true。
-x 判断当前请求文件是否为可执行文件。

大小写匹配

2.防止盗链

~* 为不区分大小写匹配 

一、ngx_http_rewrite_module
The ngx_http_rewrite_module module is used tochange request URI using PCRE regular expressions,
return redirects, and conditionally select configurations.
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换

示例:
http://www.a.com/hn--> http://www.a.com/henan
http://www.a.com--> https://www.a.com/

1、 rewrite regex replacement [flag]

将用户请求的URI基于regex所描述的模 式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查隐含有循环机制,但不超过10次;
如果超过,提示500响应码, [flag]所表示的标志位用于控制此循环机制
如果replacement是以

 [flag]:
last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;
结束循环,建议在location中使用
redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;
不能以http://或https://开头,使用相对路径,状态码: 302
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301

zz页面跳转到zhengzhou

澳门新萄京官方网站 3

临时重定向

澳门新萄京官方网站 4

澳门新萄京官方网站 5

永久重定向

澳门新萄京官方网站 6

澳门新萄京官方网站 7

澳门新萄京官方网站 8

location /zz 也可以针对zz uri做访问控制 访问zz目录旧跳转到zhengzhou目录下,内容更清晰作用根上面一样

澳门新萄京官方网站 9

2、 return  
作用域:server,location,if
return code [text];
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码

3、 rewrite_log on | off;
是否开启重写日志, 发送至error_log( notice level)

 4、 set $variable value;
用户自定义变量
注意:变量定义和调用都要以$开头

5、 if (condition) { ... }
引入新的上下文,条件满足时,执行配置块中的配置指令; server, location
condition:
比较操作符:
== 相同
!= 不同
~:模式匹配,区分字符大小写
~*:模式匹配,不区分字符大小写
!~:模式不匹配,区分字符大小写
!~*:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件
-d, !-d 目录
-x, !-x 执行
if指令实例

if ($http_user_agent ~ MSIE) {             
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;] )(?:;|$)") {
     set $id $1;
 }
if ($request_method = POST) {
     return 405;
 }
 if ($slow) {
     limit_rate 10k;
 }

当访问admin目录时候系统就会返回403和disallow(返回可自定义)

澳门新萄京官方网站 10

澳门新萄京官方网站 11

跳转到别的url www.baidu.com

澳门新萄京官方网站 12

澳门新萄京官方网站 13

添加状态码跳转

澳门新萄京官方网站 14

显示302临时跳转

澳门新萄京官方网站 15

三、break指令

break指令用来终止当前相同作用域下的其后的Nginx配置。Nginx服务器在根据配置处理请求的过程中遇到这个指令时,会回到上一层作用域,继续向下读取配置;也就是说在同一作用域下的Nginx配置,位于该指令之后,都将失效
实例:

location / {
    if ($slow){                  ## 产生作用域
        set $id $1;              ## 位于break之前,有效
        break;
        limit_rate 10k;          ## 位于break之后,配置无效
    }

    ## Nginx其他配置(依旧有效)
}

~ 为区分大小写匹配

符合盗链 —— 重写

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 

二、ngx_http_referer_module

通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求.
The ngx_http_referer_module module is used to block access to a site for requests with invalid values in the
“Referer” header field. 可防止盗链

1、 valid_referers none|blocked|server_names|string ...;
定义referer首部的合法可用值,不能匹配的将是非法值
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式  本网站
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*.magedu.com

示例:
valid_referers none block server_names *.a.com *.a.com a.* a.* ~.baidu.;
if ($invalid_referer) {
return 403 http://www.a.com; 
}

首部添加从哪里跳转过来的

澳门新萄京官方网站 16

a页面跳转到b页面

澳门新萄京官方网站 17

vim index.html website B

澳门新萄京官方网站 18

澳门新萄京官方网站 19

nginx -s reload

点击www.b.com会看到b.com的文件内容website B

澳门新萄京官方网站 20

可以从日志看到跳转信息
cd /var/log/nginx
a.com代表从哪里位置跳转

澳门新萄京官方网站 21

b.com也可以盗用a.com目录下的a.jpg图片

澳门新萄京官方网站 22

澳门新萄京官方网站 23

vim b.html 编写website2目录下的页面

澳门新萄京官方网站 24

打开b.com显示的图片确是a.com的图片,在用户层面也不知道,对a.com来说消耗了它的带宽来为b.com服务

澳门新萄京官方网站 25

盗链成功

日志查询可以看到从b.com下载的a.jpg

澳门新萄京官方网站 26

nginx日志都储存在一起,不容易找到可以给文件设置独立存储

澳门新萄京官方网站 27

第一个日志上会看到图片被转发到哪个网址上面,b.com就是盗链网站
第二个日志是a.com本机正常访问,被转发位置正常是为空

澳门新萄京官方网站 28

如何防止referers盗链
允许请求
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式 本网站
包含baid字符的域名也允许
if.......非法的403,转跳到www.a.com(可自定义网站)

澳门新萄京官方网站 29

访问www.b.com/b.html 盗链a.com内容已经无法打开,F12可以看到403

澳门新萄京官方网站 30

四、return指令

return指令用于完成对请求的处理,可以直接向客户端返回响应状态代码。所有处理该指令后的Nginx都将无效。该指令通常在server块和location块配合if指令使用,具体语法如下:

return [text];
return code URL;
return URL;

code,返回给客户端的状态码。可以为0~999之前的任意HTTP状态码(非标准的444可以强制关闭服务器与客户端之间的连接)。
text, 为返回给客户端的响应体内容,支持使用变量。
URL,返回给客户端一个URL地址

通常会配置return指令来处理域名重定向,代码如下:

if ($true){
    return 301 http://www.lyblog.net
}

~* 为不区分大小写匹配

澳门新萄京官方网站 31

文件及目录匹配

五、rewrite指令

该指令通过正则表达式的使用来改变URI。可以同时存在一个或多个指令,按照顺序依次对URL进行匹配和处理。
可以在server块或location中使用,如下格式:

rewrite regex replacement [flag];

!和!*分别为区分大小写不匹配及不区分大小写不匹配

说明:if ($invalid_referer) {,if的后面是有空格的,如果没有会配置错误,这个要留意;valid_referers这句后面还可以继续补充允许的主机名

-f和!-f用来判断是否存在文件 

regex,用于匹配URI的正则表达式。使用括号"()"标记要截取的内容。

regex 只能接受到$document_uri(如上面的示例url http://www.yllin.com:5055/user/index?id=1&type=3,只能接收到 /user/index)

replacement,匹配成功后用于替换URI中被截取内容的字符串。默认情况下,如果该字符串是由"
1、可以在if中使用,

if ($host = 'www.yllin.cn') {
    rewrite ^.*$ http://www.baidu.com$request_uri? permanent;
}

文件及目录匹配

 

-d和!-d用来判断是否存在目录 

flag,用来设置rewrite对URI的处理行为,可以为以下标志中的任意一个。

①last
终止在本location块中处理接收到的URI,并将处理后的URI作为一个新的URI,使用各location块进行处理。该标志将重写后的URI重新在server块中执行,为重写后的URI提供了转入到其他location块的机会。如下

location / {
             if (!-e $request_filename){
                 rewrite . /router.php last;
             }
             #autoindex  on;
        }

上面的意思是,如果当前的url没有找到目录或者文件,就 替换成 /router.php
http://www.yllin.com:5055/user/index?id=1&type=3 会比默认替换成
http://www.yllin.com:5055/router.php?id=1&type=3进行请求
②break
将此处理重写的URI作为新的URI,在本块中继续进行处理。该标识将重写后的地址在当前的location块中执行,不会将新的URI转向其他location块中。请看如下示例:

location /lyblog/ {
    rewrite ^(/lyblog/.*)/media/(.*)..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/lyblog/.*)/audio/(.*)..*$ $1/mp3/$2.ra break;
}

如果URI在第2行匹配成功并处理,Nginx服务器将新的URI继续在location中执行第3行规则中匹配处理,新的URI始终在同一个location块中。
③redirect,
将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以"
④permanent
将重写后的URI返回给客户端,状态码为301,表示永久跳转。

-f和!-f用来判断是否存在文件

澳门新萄京官方网站 32

-e和!-e用来判断是否存在文件或目录 

六、set 指令

set指令主要是用来设置变量,其语法结构为:

set variable value

variable,变量名,必须以"$"符号作为变量的第一个字符,且不能与Nginx预设的变量同名
value,为变量赋值,可以为字符串,其他变量或变量组合

-d和!-d用来判断是否存在目录

 

-x和!-x用来判断文件是否可执行 

七、域名跳转

## 示例1
...
server {
    listen 80;
    server_name lyblog.net;
    rewrite ^/ http://www.lyblog.net/;             ## 域名跳转
    ...
}
...

## 示例2
...
server {
    listen 80;
    server_name lyblog.net www.lyblog.net;
    if ($host ~ myweb.net){
        rewrite ^(.*) http://www.lyblog.org$1 permanent;          ## 多域名跳转
    }
}


## 示例3
...
server {
    listen 80;
    server_name demo1.lyblog.net demo2.lyblog.net;
    if ($http_host ~* ^(.*).lyblog.net$){
        rewrite ^(.*) http://demo.lyblog.net$1;                     ## 三级域名的跳转
    }
}

-e和!-e用来判断是否存在文件或目录

 

flag标记

八、域名镜像

镜像网站是指将一个完全相同的网站分别放置到几个服务器上,并分别使用独立的URL,其中一个服务器上的网站叫主站,其他的都为镜像网站。镜像站就可以看作是主站的一个副本。可以在主站存在问题时,作备份服务器使用。另外,也可以提高不同地区网站的响应速度。镜像网站可以响应网站流量负载,解决网络带宽封锁等问题。

Nginx中的Rewrite功能可以轻松实现域名镜像的跳转。实现原理很简单,也就是把不同镜像URL重写到指定的URL就可以了。以下是示例配置:

server {
    ...
    listen 80;
    server_name google.lyblog.net;
    rewrite ^(.*) http://www.google.com$1 last;
}
server {
    ...
    listen 81;
    server_name bings.lyblog.net;
    rewrite ^(.*) http://bings.cn$1 last;
}

当然,我们也可以为某一个目录下镜像,实现如下:

server {
    listen 80;
    server_name cdn.lyblog.net;
    location ^~ /source {
        ...
        rewrite ^/source(.*) http://cdn.google.com/websrc2$1 last;
    }
}

server {
    listen 81;
    server_name cdn1.lyblog.net;
    rewrite ^(.*) http://cdn.baidu.com/

    location ^~ /source2 {
        ...
        rewrite ^/source2(.*) http://cdn.baidu.com/websrc2$1 last;
    }
}

-x和!-x用来判断文件是否可执行

**************************************************************************************************************************************************

last 相当于Apache里的[L]标记,表示完成rewrite

九、目录前自动添加"/"

如果网站设定了默认资源文件,那么客户端访问时可以不加具体的资源文件名。如,你访问:http://www.yllin.cn时,直接就可以访问到"/index.html"文件。

如果访问一个二级目录,如:http://www.yllin.cn/user/index.html;则如果直接输入http://www.yllin.cn/user可能无法访问,必须在后面加上斜线http://www.yllin.cn/user/。像这种情况,也不可能去要求用户这么输入,可以通过Rewrite功能为末尾没有斜杠"/":

server {
    ...
    listen 81;
    server_name www.yllin.cn;
    location ^~ /bbs {
        ...
        if (-d $request_filename){
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
        }
    }
}

flag标记

符合盗链 —— 返回一个错误

break 终止匹配, 不再匹配后面的规则。

十、目录合并

搜索引擎优化是一种利用搜索引擎的索引规则来提高网站排名。其中目录也是增强SEO的一种手段。如一个网站的路径如下:

[root]/server/12/34/56/78/9.html

如果用户访问这个资源,则URL也必须写成http://www.yllin.com/server/12/34/56/78/9.html;这非常利于SEO,并且对用户的输入也存在难度。对于以上URL,可以改写成http://www.yllin.com/server/12-34-56-78-9.html,具体配置如下:

server {
    ...
    listen 80;
    server_name www.yllin.com;
    location ^~ /server {
        ...
        rewrite ^/server-([0-9] )-([0-9] )-([0-9] )-([0-9] )-([0-9] ).html$ /server/$1/$2/$3/$4/$5.html last;
        break;
    }

}

last 相当于Apache里的[L]标记,表示完成rewrite

澳门新萄京官方网站 33

redirect 返回302临时重定向 地址栏会显示跳转后的地址。

十一、防盗链

盗链是一种损害原始网站合法利益,给原服务器造成额外负担。首先了解一下防盗链的原理。

客户端向服务器请求资源时,为了减少网络带宽,提高响应速度,服务器一般不会一次把所有资源完整的传给客户端。如,请求一个网页,首先传回网页文本文件,当服务器解析网页时,再开始下载资源文件,如图片,样式表,可执行脚本。如果这些资源文件不是放在该服务器上,而在其他服务器上。这就构成了盗链。

要防止盗链,需要了解HTTP协议中的请求头部的Referer头域和采用URL的格式表示访问当前网页或者文件的源地址。通过头域的值,可以检测到访问目标资源的源地址。这样,如果检测到Referer头域中的值并不是自己站点内的URL,就采取阻止措施,实现防盗链的目的。但是,Referer头域的值是可以更改的,因此该方法不能够完全阻止所有盗链。

Nginx配置中有一个指令 valid_referers,用来获取 Referer 头域中的值,并且根据该值的情况给$invalid_referer变量赋值。如果 Referer 头域中没有符合 valid_referers 指令配置的值,则$invalid_referer 变量将会被赋值为1。valid_referers 指令的语法结构为:

valid_referers none | blocked | server_names | string ...;

none,检测Referer头域不存在的情况
blocked,检测Referer头域的值被防火墙或代理服务器删除或伪装的情况。这种情况下,该头域的值不以"
server_names,设置一个或多个URL,检测Referer头域的值是否是这些URL中的某个。在Nginx 0.5.33以后支持使用通配符"*"

有了valid_referers指令和$invalid_referer变量,配合Rewrite功能就可以实现防盗链。有两种实现方案:1、根据资源文件类型;2、根据请求的目录

以下是根据资源文件类型:

server {
    ...
    listen 80;
    server_name www.yllin.com;
    location ~* ^. .(gif|jpg|png|swf|flv|rar|zip)$ {
        ...
        valid_referers none blocked server_names *.lyblog.net;
        if ($invalid_referer){
            rewrite ^/ http://www.yllin.comult.jpg;
        }
    }

}

下面是根据目录实现防盗链的配置:

server {
    ...
    listen 80;
    server_name www.yllin.com;
    location /file/ {
        ...
        root /server/file/;
        valid_referers none blocked server_names *.myblog.net;

        if($invalid_referer){
            rewrite ^/ http://www.yllin.comult.jpg;
        }
    }

}

参考来源 https://www.lyblog.net/detail/600.html

break 终止匹配, 不再匹配后面的规则。

澳门新萄京官方网站 34

permanent 返回301永久重定向 地址栏会显示跳转后的地址。

redirect 返回302临时重定向 地址栏会显示跳转后的地址。

 

 

permanent 返回301永久重定向 地址栏会显示跳转后的地址。

说明:上述配置中的location /images/改为location /,可以防止一切盗链

logcation的几个使用实例:

logcation的几个使用实例:

*******************************************************************************************************************************************

   1)location  / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
   2)location =/ {}:仅仅匹配/
   3)location ~* .(gif|jpg|jpeg)$

1)location / { }:匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
2)location =/ {}:仅仅匹配/
3)location ~* .(gif|jpg|jpeg)$

防止盗链jpg格式的图片

     {
        rewrite .(gif|jpg)$ /logo.png;
     }:location不区分大小写,匹配任何以gif,jpg,jpeg结尾的文件。


rewrite .(gif|jpg)$ /logo.png;
}:location不区分大小写,匹配任何以gif,jpg,jpeg结尾的文件。

澳门新萄京官方网站 35

 

几个实例:

 

几个实例:

多目录转成参数

澳门新萄京官方网站 36

多目录转成参数 

要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

澳门新萄京官方网站 37

要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2 

规则配置:

 

规则配置:

if ($host ~* (.*).domain.com) {

location 语句中的 ~* 表示不区分大小写的正则匹配

if ($host ~* (.*).domain.com) { 

set $sub_name $1;

########################################################################################################################## 

    set $sub_name $1;

rewrite ^/sort/(d )/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

应用在flask项目中

    rewrite ^/sort/(d )/?$ /index.php?act=sort&cid=$sub_name&id=$1 last; 

澳门新萄京官方网站,}

澳门新萄京官方网站 38 

目录对换

 

目录对换 

要求:/123456/xxxx -> /xxxx?id=123456

 

要求:/123456/xxxx -> /xxxx?id=123456 

规则配置:

规则配置:

rewrite ^/(d )/(. )/ /$2?id=$1 last;

rewrite ^/(d )/(. )/ /$2?id=$1 last; 

再来一个针对浏览器优化的自动rewrite,这里rewrite后的目录可以是存在的;

 

例如设定nginx在用户使用ie的使用重定向到/nginx-ie目录

再来一个针对浏览器优化的自动rewrite,这里rewrite后的目录可以是存在的;

规则如下:

例如设定nginx在用户使用ie的使用重定向到/nginx-ie目录

if ($http_user_agent ~ MSIE) {

规则如下:

rewrite ^(.*)$ /nginx-ie/$1 break;

 if ($http_user_agent ~ MSIE) {

}

     rewrite ^(.*)$ /nginx-ie/$1 break; 

目录自动加“/” ,这个功能一般浏览器自动完成

if (-d $request_filename){

目录自动加“/” ,这个功能一般浏览器自动完成

rewrite /(.*)([/])$ permanent;

if (-d $request_filename){ 

}

rewrite ^/(.*)([^/])$ permanent; 

以下这些可能就跟广义的rewrite重写无关了

禁止htaccess

以下这些可能就跟广义的rewrite重写无关了

location ~/.ht {

禁止htaccess 

deny all;

location ~/.ht { 

}

    deny all; 

禁止多个目录

location ~ ^/(cron|templates)/ {

禁止多个目录 

deny all; break;

location ~ ^/(cron|templates)/ { 

}

    deny all; break; 

禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求

location ~ ^/data {

禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求

deny all;

location ~ ^/data { 

}

    deny all; 

禁止单个文件

location ~ /data/sql/data.sql {

禁止单个文件 

deny all;

location ~ /data/sql/data.sql { 

}

    deny all; 

给favicon.ico和robots.txt设置过期时间; 这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) {

给favicon.ico和robots.txt设置过期时间; 这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志 

log_not_found off;

location ~(favicon.ico) { 

expires 99d;

    log_not_found off; 

break;

    expires 99d; 

}

    break; 

location ~(robots.txt) {

log_not_found off;

location ~(robots.txt) { 

expires 7d;

    log_not_found off; 

break;

    expires 7d; 

}

    break; 

设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js {

设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志 

access_log off;

location ^~ /html/scripts/loadhead_1.js { 

expires 600;

    access_log off; 

break;

    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这类文件的保质期设置为一小时。

Nginx还可以自定义某一类型的文件的保质期时间,具体写法看下文的代码:

防盗链的设置:

location ~* .(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
   expires    1h;
   break;
  }
  }

防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:

//上段代码就将js|css|jpg|jpeg|gif|png|swf这类文件的保质期设置为一小时。

location ~* .(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ ;
}
}

 

文件反盗链并设置过期时间--<盗链多次请求也会打开你的站点的图片啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图片>

防盗链的设置:

location ~* ^. .(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

防盗链:如果你的网站是个下载网站,下载步骤应该是先经过你的主页找到下载地址,才能下载,为了防止某些网友直接访问下载地址完全不通过主页下载,我们就可以使用防盗链的方式,具体代码如下:

valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost 42.121.107.189;

location ~* .(gif|jpg|swf)$ {
  valid_referers none blocked start.igrow.cn sta.igrow.cn;
  if ($invalid_referer) {
  rewrite ^/ ;
  }
}

if ($invalid_referer) {

 

rewrite ^/ http://img.jjonline.cn/forbid.gif;

文件反盗链并设置过期时间--<盗链多次请求也会打开你的站点的图片啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图片>

return 417;

location ~* ^. .(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 

break;

    valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost  42.121.107.189; 

}

    if ($invalid_referer) { 

access_log off;

        rewrite ^/ ; 

break;

        return 417; 

}

        break; 

说明:

    } 

这里的return 417 为自定义的http状态码,默认为403,方便通过nginx的log文件找出正确的盗链的请求地址

    access_log off; 

“rewrite ^/ http://img.jjonline.cn/forbid.gif;”显示一张防盗链图片

    break; 

“access_log off;”不记录访问日志,减轻压力

“expires 3d”所有文件3天的浏览器缓存

说明:

只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行

 

location {

这里的return 417 为自定义的http状态码,默认为403,方便通过nginx的log文件找出正确的盗链的请求地址 

allow 22.27.164.25; #允许的ipd

“rewrite ^/

deny all;

 “access_log off;”不记录访问日志,减轻压力 

auth_basic “KEY”; #认证的一些设置

“expires 3d”所有文件3天的浏览器缓存 

auth_basic_user_file htpasswd;

 

}

 

说明:location的应用也有各种变化,这里的写法就针对了根目录了。

只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行

文件和目录不存在的时重定向

location { 

if (!-e $request_filename) {

    allow 22.27.164.25; #允许的ipd

proxy_pass ; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器

rewrite ^/ http://www.jjonline.cn/none.html; #跳转到这个网页去

    deny all; 

return 404; #直接返回404码,然后会寻找root指定的404.html文件

}

域名跳转

server {

listen 80;

server_name jump.jjonline.cn ;#需要跳转的多级域名

index index.html index.htm index.php; #入口索引文件的名字

root /var/www/public_html/; #这个站点的根目录

rewrite ^/ http://www.jjonline.cn/;

    auth_basic “KEY”; #认证的一些设置

rewrite到这个地址,功能表现:在浏览器上输入jump.jjonline.cn并回车,不会有任何提示直接变成www.jjonline.cn

access_log off;

}

多域名转向

server {

listen 80;

server_name www.jjonline.cn www.jjonline.org;

index index.html index.htm index.php;

root /var/www/public_html/;

if ($host ~ “jjonline.org”) {

rewrite ^(.*) http://www.jjonline.cn$1 permanent;

}

}

三级域名跳转

if ($http_host ~* “^(.*).i.jjonline.cn$”) {

rewrite ^(.*) http://demo.jjonline.cn$1;

break;

}

域名镜向

server {

listen 80;

server_name mirror.jjonline.cn;

index index.html index.htm index.php;

root /var/www/public_html;

rewrite ^/(.*) http://www.jjonline.cn/$1 last;

access_log off;

}

某个子目录作镜向,这里的示例是demo子目录

location ^~ /demo {

澳门新萄京官方网站:基础及实例,幸免盗链。rewrite ^. http://demo.jjonline.cn/ last;

break;

}

以下在附带本博客的rewrite写法,emlog系统的rewrite

location ~ {

if (!-e $request_filename) {

rewrite ^/(. )$ /index.php last;

}

}

今天搞https接入的时候,nginx这边进行https的认证加解密功能,所以后端的nginx和apache都是不需要进行什么变化的,业务 也是如此,但是有一个业务稍微有点不同,其需要根据http接入和https接入的不同来做吐出不同的东东,由于nginx这一层接入来做的ssl相关的 东东,到了后端的apache这里已经是http的了(这样做的目的是为了省事和性能考虑)。这是cgi并不知道转发过来的是http的请求还是 https的请求。

于是就需要在前端接入nginx这里做一些调整,使得到后端的时候能够判断是否是https的。

想到的一个简单的方法就是通过rewrite规则,将请求的参数后面增加一个特殊的参数用于表示这是https的请求。

于是配置转发的规则,在location里面配置了怎么也不行,于是只能在server里面通过if判断来进行配置了。

if ( $request_uri ~* ^// ) {
rewrite ^(. )$ $1?
https=1 last;
}

问题得到了解决,到后端apache的请求都会带上一个特殊的***https的请求参数啦,从而方便了后端的程序来进行判断。

呵呵,当然也可以通过配置其它的虚拟主机的方式来实现,不过这样的话,就要拷贝一份程序的代码,为https写一份差不多相同的代码,实在麻烦。

在使用nginx的rewrite的时候,开始加上了$query_string 发现到了后端的参数是double了的,查阅了一下发现:
rewrite

语法: rewrite regex replacement flag

默认: none

作用域: server, location, if

This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.

这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。

Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:

注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。

呵呵,rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的 ,因此,我们只是加上了一个?号和后面我们想要的一个小小的参数***https=1就可以了。

nginx的rewrite规则参考:

~ 为区分大小写匹配
~* 为不区分大小写匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹

-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行

last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
break 终止匹配, 不再匹配后面的规则
redirect 返回302临时重定向 地址栏会显示跳转后的地址
permanent 返回301永久重定向 地址栏会显示跳转后的地址

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

结合QeePHP的例子

if (!-d $request_filename) {
rewrite ^/([a-z-A-Z] )/([a-z-A-Z] )/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
rewrite ^/([a-z-A-Z] )/?$ /index.php?namespace=user&controller=$1 last;
break;

多目录转成参数
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*).domain.com) {
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;

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}

目录自动加“/”

if (-d $request_filename){
rewrite /(.*)([/])$ permanent;
}

禁止htaccess

location ~/.ht {
deny all;
}

禁止多个目录

location ~ ^/(cron|templates)/ {
deny all;
break;
}

禁止以/data开头的文件
可以禁止/data/下多级目录下.log.txt等请求;

location ~ ^/data {
deny all;
}

禁止单个目录
不能禁止.log.txt能请求

location /searchword/cron/ {
deny all;
}

禁止单个文件

location ~ /data/sql/data.sql {
deny all;
}

给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) {
log_not_found off;
expires 99d;
break;
}
location ~(robots.txt) {
log_not_found off;
expires 7d;
break;
}

设定某个文件的过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js {
access_log off;
root /opt/lampp/htdocs/web;
expires 600;
break;
}

文件反盗链并设置过期时间
这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”显示一张防盗链图片
“access_log off;”不记录访问日志,减轻压力
“expires 3d”所有文件3天的浏览器缓存

location ~* ^. .(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
if ($invalid_referer) {
rewrite ^/ http://leech.c1gstudio.com/leech.gif;
return 412;
break;
}
access_log off;
root /opt/lampp/htdocs/web;
expires 3d;
break;
}

只充许固定ip访问网站,并加上密码

root /opt/htdocs/www;
allow 208.97.167.194;
allow 222.33.1.2;
allow 231.152.49.4;
deny all;
auth_basic “C1G_ADMIN”;
auth_basic_user_file htpasswd;

将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html

rewrite ^/job-([0-9] )-([0-9] )-([0-9] ).html$ /job/$1/$2/jobshow_$3.html last;

将根目录下某个文件夹指向2级目录
如/shanghai job/ 指向 /area/shanghai /
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/

rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

上面例子有个问题是访问/shanghai 时将不会匹配

rewrite ^/([0-9a-z] )job$ /area/$1/ last;
rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。

那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

if (-d $request_filename){
rewrite /(.*)([/])$ permanent;
}

知道原因后就好办了,让我手动跳转吧

rewrite ^/([0-9a-z] )job$ /$1job/ permanent;
rewrite ^/([0-9a-z] )job/(.*)$ /area/$1/$2 last;

文件和目录不存在的时候重定向:

if (!-e $request_filename) {
proxy_pass ;
}

域名跳转

server
{
listen 80;
server_name jump.c1gstudio.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/ http://www.c1gstudio.com/;
access_log off;
}

多域名转向

server_name www.c1gstudio.com www.c1gstudio.net;
index index.html index.htm index.php;
root /opt/lampp/htdocs;
if ($host ~ “c1gstudio.net”) {
rewrite ^(.*) http://www.c1gstudio.com$1 permanent;
}

三级域名跳转

if ($http_host ~* “^(.).i.c1gstudio.com$”) {
rewrite ^(.
) http://top.yingjiesheng.com$1;
break;
}

域名镜向

server
{
listen 80;
server_name mirror.c1gstudio.com;
index index.html index.htm index.php;
root /opt/lampp/htdocs/www;
rewrite ^/(.*) http://www.c1gstudio.com/$1 last;
access_log off;
}

某个子目录作镜向

location ^~ /zhaopinhui {
rewrite ^. http://zph.c1gstudio.com/ last;
break;
}

discuz ucenter home (uchome) rewrite

rewrite ^/(space|network)-(. ).html$ /$1.php?rewrite=$2 last;
rewrite ^/(space|network).html$ /$1.php last;
rewrite ^/([0-9] )$ /space.php?uid=$1 last;

discuz 7 rewrite

rewrite ^(.)/archiver/((fid|tid)-[w-] .html)$ $1/archiver/index.php?$2 last;
rewrite ^(.
)/forum-([0-9] )-([0-9] ).html$ $1/forumdisplay.php?fid=$2&page=$3 last;
rewrite ^(.)/thread-([0-9] )-([0-9] )-([0-9] ).html$ $1/viewthread.php?tid=$2&extra=page=$4&page=$3 last;
rewrite ^(.
)/profile-(username|uid)-(. ).html$ $1/viewpro.php?$2=$3 last;
rewrite ^(.)/space-(username|uid)-(. ).html$ $1/space.php?$2=$3 last;
rewrite ^(.
)/tag-(. ).html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

server_name bbs.c1gstudio.com news.c1gstudio.com;
location = / {
if ($http_host ~ news.c1gstudio.com$) {
rewrite ^. http://news.c1gstudio.com/forum-831-1.html last;
break;
}
}

discuz ucenter 头像 rewrite 优化

location ^~ /ucenter {
location ~ .*.php?$
{

    auth_basic_user_file htpasswd; 

fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location /ucenter/data/avatar {
log_not_found off;
access_log off;
location ~ /(.)_big.jpg$ {
error_page 404 /ucenternoavatar_big.gif;
}
location ~ /(.
)_middle.jpg$ {
error_page 404 /ucenternoavatar_middle.gif;
}
location ~ /(.*)_small.jpg$ {
error_page 404 /ucenternoavatar_small.gif;
}
expires 300;
break;
}
}

jspace rewrite

location ~ .*.php?$
{

}

fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
location ~* ^/index.php/
{
rewrite ^/index.php/(.*) /index.php?$1 break;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

说明:location的应用也有各种变化,这里的写法就针对了根目录了。

文件和目录不存在的时重定向

if (!-e $request_filename) { 

    #proxy_pass ; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器

    rewrite ^/ ;  #跳转到这个网页去

    #return 404; #直接返回404码,然后会寻找root指定的404.html文件

域名跳转 

server { 

    listen 80; 

    server_name jump.jjonline.cn ;#需要跳转的多级域名

    index index.html index.htm index.php; #入口索引文件的名字

    root /var/www/public_html/; #这个站点的根目录

    rewrite ^/ ; 

    #rewrite到这个地址,功能表现:在浏览器上输入jump.jjonline.cn并回车,不会有任何提示直接变成www.jjonline.cn

    access_log off; 

多域名转向 

 

server { 

    listen 80; 

 

    server_name www.jjonline.cn www.jjonline.org;

    index index.html index.htm index.php; 

    root /var/www/public_html/; 

    if ($host ~ “jjonline.org”) { 

        rewrite ^(.*) permanent; 

    } 

}

三级域名跳转 

if ($http_host ~* “^(.*).i.jjonline.cn$”) { 

    rewrite ^(.*) ; 

    break; 

域名镜向 

server { 

    listen 80; 

    server_name mirror.jjonline.cn; 

    index index.html index.htm index.php; 

    root /var/www/public_html; 

    rewrite ^/(.*) last; 

    access_log off; 

某个子目录作镜向,这里的示例是demo子目录

location ^~ /demo { 

    rewrite ^. last; 

    break; 

}

以下在附带本博客的rewrite写法,emlog系统的rewrite

 

location ~ {

    if (!-e $request_filename) {

           rewrite ^/(. )$ /index.php last;

    }

}

 

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站:基础及实例,幸免盗链

关键词: