Nginx 将 URL 重写为 https 时参数未传输

Nginx 将 URL 重写为 https 时参数未传输

我有 nginx 前端和 tomcat 后端。现在我需要.do使用 ssl 加密从客户端到 nginx 服务器的特定 url 结尾。并且 js/css 可以通过 http 请求。为了避免在请求 https 时内容与 http 资源混合,我还设置了.jsp不使用 https。

这是我的主要内容nginx.conf

server {
    listen       80;
    server_name  localhost;
    ...
    location / {
        root  /apps/oa/oaapp/OA1;
        index  index.jsp index.html;
    }
    location ~ .*\.do$ {
        rewrite ^(.*)$ https://ittest.example.com$1 permanent;
    }
}

server {
    listen 443;
    server_name ittest.example.com;

    ssl on;
    ...

location / {
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:8080/;
} 

但是当我通过 登录时出现问题http://ittest.example.com/login.html。页面将用户名和密码发送到 以http://ittest.example.com/member/login.do处理请求。我的重写规则将其重定向到https:/ittest.example.com/member/login.do(ssl encrytion)。

但我发现请求方法已从 POST 更改为 GET,并且使用 Chrome 开发工具时未看到用户名/密码发送到服务器。所以失败了!

我该怎么做才能纠正它?

答案1

你确实应该重定向到 sslPOST。这才是使用 SSL 的根本原因。否则用户将以未加密的形式发布其凭据!

理论上,你可以用一些虚拟的 javascript 来提供 200 OK,而不是将 302 重定向到 https,这些 javascript 会执行隐藏的提交 onload 以将表单重新发布到 https,但实际上,最好的解决方案是重定向http://ittest.example.com/login.htmlhttps://ittest.example.com/login.html。您永远不希望凭证通过 http 进行传输。

相关内容