项目背景:
将域名请求从默认的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