Nginx根据$host及请求的URI规则重定向rewrite

项目背景:

        将域名请求从默认的80端口转发到443 ssl。本项目特殊之处是一个端口监听多个域名,某些域名还有跳转到特定的地址。

普通情况:

        server {
        listen       80;                                    #默认的80端口,非加密通信
        server_name xxx.org.cn;                   #监听的请求域名

        rewrite ^(.*)$ https://${server_name}$1 permanent;   
            }

说明:
rewrite 为固定关键字,表示开始进行rewrite匹配规则。
regex 为 ^/(.*)。 这是一个正则表达式,匹配完整的域名和后面的路径地址。
replacement就是 http://xxx.org.cn/$1 这块了,其中$1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。
flag 就是 permanent,代表永久重定向的含义,即跳转到 http://xxx.org.cn/$1 地址上。

本项目情况:

        Nginx默认的80端口监听多个域名。

        废话不多数,直接贴配置。

 server {
       listen    80; 

        # 同时监听多个域名

       server_name  a.stm.cn;
       server_name  b.stm.cn;
       server_name  c.stm.cn;
       # 实现访问http://a.sdstm.cn 不带URI
       # 自动跳转https://a.sdstm.cn/main/

        # 因为Nginx不支持if判断嵌套,也不支持逻辑或与,设置标识符
       set $flag 0;

        #  判断请求的host,匹配则修改标识符
       if ($host = 'a.sdstm.cn' ){
           set $flag "${flag}1";
       }

        # 判断请求的当前URI,匹配则修改标识符
       if ($document_uri = '/'){
           set $flag "${flag}1";
       }

        # 判断当前标识符的值,匹配则跳转到对应地址
       if ( $flag = '011' ){
          rewrite ^(.*)$ https://$host/main permanent;  
       }

        # 匹配以“stm.cn”为后缀的域名请求,匹配则跳转到对应的https地址
       if ( $host ~ '(stm.cn)$' ){
            rewrite ^(.*)$ https://$host$1 permanent;          #跳转到对应的$host地址
            #rewrite ^(.*)$ https://${server_name}$1 permanent;  #全部跳转到域名a.stm.cn
       }

知识拓展

if (condition) {
 // ....
}

该指令用来支持条件判断的,并且根据条件判断结果来选择不同的nginx的配置,我们可以在server块或location块中配置该指令。

condition 是布尔值 true/false的含义。

Rewrite 指令可用的全局变量如下:

1. $args: 该变量中存放了请求URL中的请求指令。比如 http://127.0.0.1:3001?arg1=value1&arg2=value2 中的
"arg1=value1&arg2=value2"。
2. $content_length: 该变量中存放了请求头中的Content-length字段。
3. $content_type: 该变量中存放了请求头中的 Content-type字段。
4. $document_root: 该变量中存放了针对当前请求的根路径。
5. $document_uri: 该变量中存放了请求的当前URI, 但是不包括请求指令。比如 http://xxx.abc.com/home/1?arg1=value1&
arg2=value2; 中的 "/home/1"
6. $host: 变量中存放了请求的URL中的主机部分字段,比如http://xxx.abc.com:8080/home中的 xxx.abc.com.
7. $http_host: 该变量与$host唯一区别带有端口号:比如上面的是 xxx.abc.com:8080
8. $http_user_agent: 变量中存放客户端的代理信息。
9. $http_cookie, 该变量中存放客户端的cookie信息。
10. $remote_addr 该变量中存放客户端的地址。
11. $remote_port 该变量中存放了客户端与服务器建立连接的端口号。
12. $remote_user 变量中存放客户端的用户名。
13. $request_body_file 变量中存放了发给后端服务器的本地文件资源的名称
14. $request_method 变量中存放了客户端的请求方式,比如 'GET'、'POST'等。
15. $request_filename 变量中存放了当前请求的资源文件的路径名。
16. $request_uri 变量中存放了当前请求的URI,并且带请求指令。
17. $query_string 和变量$args含义一样。
18. $scheme 变量中存放了客户端请求使用的协议,比如 'http', 'https'等。
19. $server_protocol 变量中存放了客户端请求协议的版本, 比如 'HTTP/1.0'、'HTTP/1.1' 等。
..... 等等

'=' 表示值相同

'~' 表示匹配过程中对大小写敏感。
'~*' 表示匹配过程中对大小写不敏感。
'!~' 如果 '~' 匹配失败时,那么该条件就为true。
'!~*' 如果 '~*' 匹配失败时,那么该条件就为true

'-f' 如果请求的文件存在,那么该条件为true。
'!-f' 如果该文件的目录存在,该文件不存在,那么返回true。如果该文件和目录都不存在,则为false。如果请求的目录不存在,请求的文件存在,也为false。

if (-f $request_filename) {
 // 判断请求的文件是否存在
}

if (!-f $request_filename) {
 // 判断请求的文件是否不存在
}

 '-d',如果请求的目录存在,则返回true。否则返回false。
 '!-d', 如果请求的目录不存在,但是该请求的上级目录存在,则返回true。如果该上级目录不存在,则返回false

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值