Nginx重写功能介绍

本文详细介绍了Nginx的ngx_http_rewrite_module模块,讲解了if、set、break、return和rewrite_log指令的用法。重点讨论了rewrite指令,包括其flag的使用,以及通过案例展示了域名重定向、break和last标记的应用,自动跳转HTTP到HTTPS,以及如何通过判断文件是否存在来防止盗链。
摘要由CSDN通过智能技术生成

一. ngx_http_rewrite_module 模块

Nginx 服务器利⽤ ngx_http_rewrite_module 模块解析和处理 rewrite 请求,
此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安
装 PCRE 库,rewrite 是 nginx 服务器的重要功能之⼀,⽤于实现 URL 的重写
,URL 的重写是⾮常有⽤的功能,⽐如它可以在我们改变⽹站结构之后,不需要客
⼾端修改原来的书签,也⽆需其他⽹站修改我们的链接,就可以设置为访问,另外
还可以在⼀定程度上提⾼⽹站的安全性。

ngx_http_rewrite_module 模块会使用 PCRE 正则表达式更改用户请求的 URI、
返回重定向后 URI 指向的资源以及有条件地选择配置来更改请求 URI。

针对该模块提供的功能的配置指令有
break
if
return
rewrite
rewrite_log
set
uninitialized_variable_warn

1.1 if 指令

if 指令⽤于条件匹配,并根据条件判断结果选择相应的 Nginx 配置,可以配置在
server 或 location 块中,ngx_http_rewrite_module 的 if 语法仅能使⽤ if
做单次判断。配置形式如下:

if (condition) {
   
    action;
}
# 如果condition满足,则选择花括号内的动作执行;否则,匹配其它配置块的动作。

if 判断的条件一般会用到下面的匹配表达式:

# 匹配成功时if指令认为条件为true,执行if指定的配置指令;否则认为false,搜索匹配其它块内配置

=   # ⽐较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!=  # ⽐较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。

~   # 表⽰在匹配过程中区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~  # 为区分⼤⼩写字符且字符不匹配,不匹配为真,字符匹配为假。
~*  # 表⽰在匹配过程中不区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~* # 为不区分⼤⼩字符且字符不匹配,匹配为假,不匹配为真。
~,!~,~*,!~*等匹配规则在匹配时可以使用括号来打组,使用$1~$9来进行后向引用,或者在if语句块内重用。

-f 和 ! -f  # 判断请求的⽂件是否存在和是否不存在
-d 和 ! -d  # 判断请求的⽬录是否存在和是否不存在。
-x 和 ! -x  # 判断⽂件是否可执⾏和是否不可执⾏。
-e 和 ! -e  # 判断请求的⽂件或⽬录是否存在和是否不存在(包括⽂件,⽬录,软链接)。

.     # 匹配除换行符以外的任意字符
\w    # 匹配字母或数字或下划线或汉字
\s    # 匹配任意的空白符
\d    # 匹配数字
\b    # 匹配单词的开始或结束
^     # 匹配字符串的开始
$     # 匹配字符串的结束

*        # 重复零次或更多次
+        # 重复一次或更多次
?        # 重复零次或一次
{
   n}      # 重复n次
{
   n,}     # 重复n次或更多次
{
   n,m}    # 重复n到m次
*?       # 复任意次,但尽可能少重复
+?       # 重复1次或更多次,但尽可能少重复
??       # 重复0次或1次,但尽可能少重复
{
   n,m}?   # 重复n到m次,但尽可能少重复
{
   n,}?    # 重复n次以上,但尽可能少重复

\W       # 匹配任意不是字母,数字,下划线,汉字的字符
\S       # 匹配任意不是空白符的字符
\D       # 匹配任意非数字的字符
\B       # 匹配不是单词开头或结束的位置
[^x]     # 匹配除了x以外的任意字符
[^aeiou] # 匹配除了aeiou这几个字母以外的任意字符

注:如果$变量的值为空字符串,则 if 指令认为该条件为 false,其他条件为 true。
在 nginx-1.0.1 及以前的版本中,以 0 开头的任意字符串都认为是 false。

示例:

http {
   
......
    # pc virtual host #
    server {
   

    server_name pc.suosuoli.cn;
    listen              80;
    listen              443 ssl;
    ssl_certificate     /apps/nginx/certs/www.suosuoli.cn.crt;
    ssl_certificate_key /apps/nginx/certs/www.suosuoli.cn.key;
    ssl_session_cache   shared:sslcache:20m;
    ssl_session_timeout 10m;

    location / {
   
        root /apps/nginx/html/suosuoli;
        index index.html;

        default_type text/html;

        if ( $scheme = http ){
   
            echo "Warning!!!!";
        }

        if ( $scheme = https ){
   
            echo "Nice!!!!";
        }

        if ( !-e $request_filename ) {
   
            echo "Oops, file not find.";
            echo $request_filename;
        }
    }

    }
......
}

访问https://pc.suosuoli.cn

访问http://pc.suosuoli.cn

访问http://pc.suosuoli.cn/not_exist_file

访问https://pc.suosuoli.cn/not_exist_file

server {
   
    server_name pc.suosuoli.cn;
    listen              80;
    listen              443 ssl;
    ssl_certificate     /apps/nginx/certs/www.suosuoli.cn.crt;
    ssl_certificate_key /apps/nginx/certs/www.suosuoli.cn.key;
    ssl_session_cache   shared:sslcache:20m;
    ssl_session_timeout 10m;

 location / 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值