我有 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
你确实应该重定向到 ssl前POST。这才是使用 SSL 的根本原因。否则用户将以未加密的形式发布其凭据!
理论上,你可以用一些虚拟的 javascript 来提供 200 OK,而不是将 302 重定向到 https,这些 javascript 会执行隐藏的提交 onload 以将表单重新发布到 https,但实际上,最好的解决方案是重定向http://ittest.example.com/login.html到https://ittest.example.com/login.html。您永远不希望凭证通过 http 进行传输。