在特定目录中将 HTTPS 重定向到 HTTP

在特定目录中将 HTTPS 重定向到 HTTP

我想 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

相关内容