admin管理员组文章数量:1642347
项目背景:
将域名请求从默认的80端口转发到443 ssl。本项目特殊之处是一个端口监听多个域名,某些域名还有跳转到特定的地址。
普通情况:
server {
listen 80; #默认的80端口,非加密通信
server_name xxx; #监听的请求域名
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
说明:
rewrite 为固定关键字,表示开始进行rewrite匹配规则。
regex 为 ^/(.*)。 这是一个正则表达式,匹配完整的域名和后面的路径地址。
replacement就是 http://xxx/$1 这块了,其中$1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。
flag 就是 permanent,代表永久重定向的含义,即跳转到 http://xxx/$1 地址上。
本项目情况:
Nginx默认的80端口监听多个域名。
废话不多数,直接贴配置。
server {
listen 80;
# 同时监听多个域名
server_name a.stm;
server_name b.stm;
server_name c.stm;
# 实现访问http://a.sdstm 不带URI
# 自动跳转https://a.sdstm/main/
# 因为Nginx不支持if判断嵌套,也不支持逻辑或与,设置标识符
set $flag 0;
# 判断请求的host,匹配则修改标识符
if ($host = 'a.sdstm' ){
set $flag "${flag}1";
}
# 判断请求的当前URI,匹配则修改标识符
if ($document_uri = '/'){
set $flag "${flag}1";
}
# 判断当前标识符的值,匹配则跳转到对应地址
if ( $flag = '011' ){
rewrite ^(.*)$ https://$host/main permanent;
}
# 匹配以“stm”为后缀的域名请求,匹配则跳转到对应的https地址
if ( $host ~ '(stm)$' ){
rewrite ^(.*)$ https://$host$1 permanent; #跳转到对应的$host地址
#rewrite ^(.*)$ https://${server_name}$1 permanent; #全部跳转到域名a.stm
}
知识拓展
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/home/1?arg1=value1&
arg2=value2; 中的 "/home/1"
6. $host: 变量中存放了请求的URL中的主机部分字段,比如http://xxx.abc:8080/home中的 xxx.abc.
7. $http_host: 该变量与$host唯一区别带有端口号:比如上面的是 xxx.abc: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
版权声明:本文标题:Nginx根据$host及请求的URI规则重定向rewrite 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729334779a1196837.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论