我想 customers_api (directory)
在 HTTP 中提供服务。查看我当前的 default.conf(我使用的是 Nginx 和 Centos 7)。我尝试了这里找到的所有示例,但都不起作用。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
gzip off;
root /usr/share/nginx/html;
index index.php index.html index.htm;
server_name example.org;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/nginx/ssl/example.org/ssl-bundle.crt;
ssl_certificate_key /etc/nginx/ssl/example.org/example.org.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ecdh_curve secp384r1;
# intermediate configuration.
ssl_protocols TLSv1.2;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
## verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /etc/nginx/ssl/domain.com/ssl-bundle.crt;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
location ^~ /customers_api/ {
rewrite ^ http://example.org$request_uri? permanent;
}
}
答案1
您的配置存在多个问题。
您已启用 HSTS(HTTP 严格传输安全,RFC 6797) 已启用:
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
这是导致任何将 HTTPS 重定向到 HTTP 的尝试失败的主要原因。这是它的目的。
(否则,拥有 HSTS 是一个非常好的选择。)
这也是您遇到的最严重的问题,因为所有已经看到此标头的浏览器都不会允许在指定的 6 个月内与此域进行任何 HTTP 连接max-age
。
如果使用您的客户 API 的应用程序未实施 HSTS,这对应用程序来说可能不是问题。无论如何,测试重定向是否有效更加困难,因为您的浏览器现在配置为在客户端从 HTTP 重写为 HTTPS。
当你解决这个问题后,你当前的配置仍然存在其他问题:
你根本没有从 HTTPS 重定向到 HTTP,例如
server { listen 443 ssl http2; listen [::]:443 ssl http2; ... location /customers_api { rewrite ^/customers_api(.*) http://$server_name/customers_api$1 permanent; } }
你不提供任何来自 HTTP 服务器的服务
location /customers_api
,例如server { listen 80; listen [::]:80; location / { return 301 https://$host$request_uri; } location /customers_api { root /usr/share/nginx/html; } }
可能您
location ~ \.php$
还需要 HTTP 上的一些其他配置块。
可能的解决方法。幸运的是,您还没有includeSubDomains
在 HSTS 中设置。因此,只有example.org
被强制使用 HTTPS。您可以为这些 API 调用添加单独的子域,例如http://api.example.org/customers_api
。