我目前已将 nginx 配置为将端口 80 重定向到端口 443。
server {
listen [::]:443 ssl
listen 443 ssl;
root /var/www/my_app/public;
server_name example.com www.example.com;
# rest of my main config
}
# Here is port 80 listen
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
}
如果我注释掉第二个服务器块并添加listen 80 default_server; listen [::]:80 default_server;
到上面的块,它将允许 http 和 https 访问。
我想要实现的是,如果 url 包含,example.com/api/*
则不将 http 重定向到 https,但对于其余的 url,重定向到 https。
- example.com/api/login = 允许 http
- example.com/api/test = 允许 http
- example.com/api-docs = 重定向到 https
- example.com/anything = 重定向到 https
我如何使用 nginx 实现这一点?我是否需要有 2 个服务器块并将共享逻辑移动到单独的文件中,并针对每个端口分别考虑它们?
答案1
对端口 80 使用以下块,而不是您已有的块:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/my_app/public;
location /api {
# API specific directives
}
location / {
return 301 https://www.example.com;
}
}