gpt4 book ai didi

ssl - 意外的 302/从 HTTPS 重定向到 HTTP 导致 'insecure content' javascript 错误

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:38 25 4
gpt4 key购买 nike

我有一个带有 Ruby on Rails 3.2 后端的 ExtJS 4.1 应用程序,使用 Devise(启用了 Timeoutable)进行身份验证和 session 管理。

此问题发生在服务器上,应用仅通过 SSL 提供。 Nginx 将任何不安全的请求重定向到 https url。

问题是当 Devise session 超时时,在我的例子中是 15 分钟后,任何 AJAX 请求都会被发送/重定向到 http://myapp.com/controller?params,而不是https://myapp.com/controller?params,因为它通常会这样做。

我有客户端代码,在非 SSL 设置中可以很好地捕获潜在的 session 过期问题,并重定向到登录页面,并显示 session 已超时的消息。这是一种基于以下事实的 hack,即在 session 超时后发出请求时,会返回“无效的 JSON 字符串”错误消息。该错误包含登录页面的 HTML,因为当用户登录时应该是 json 的响应变成了应用程序应该在 session 超时时重定向到的登录页面。此代码块在我的Ext.applicationlaunch 方法中:

launch:                             function () {

Ext.Error.handle = function (err) {

$.post('/logs', {message:err.msg});

if (err.msg.indexOf("invalid JSON String") != -1 && err.msg.indexOf("<!DOCTYPE html>") != -1) {

if (err.msg.indexOf("MyApp_Login") != -1)
document.location.href = "/logout?timeout=1";
else
document.location.href = "/logout?error=1";

} else {

gritter(3, "ERROR:", "A client-side error has occurred. If this issue persists, please contact your system administrator.");

if (Ext.isWebKit) console.log(err);

}

}

if (user_signed_in == true) {

Ext.require('MyDesktop.App');
Ext.require('Ext.tab.*');

_myDesktopApp = Ext.create('MyDesktop.App');

Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider'));

}

}

所以正如我上面所说,应用程序通过非安全套接字检测到指示 session 超时的 Controller 请求(或更准确地说响应),并采取适当的措施。但是在我的服务器上,通过 SSL,由于某种原因,一旦 session 过期, Controller 调用最终将通过 http 而不是 https。在 Chrome 中导致这样的错误:

The page at https://server.myapp.com/ displayed insecure content from http://server.app.com/campaign_components_contacts.json?authenticity_token=1vokGHUpsi5w3b3P8mrfUpEGx19hrHJpsCzPayofM7c%3D&campaign_id=2&component_id=2&contact_id=1536&format=json

这会不会是 ExtJS 的一个特性,当通过 SSL 检测到问题时,它会尝试进行非安全调用?或者 Rails 的一些特性?我敢肯定两者都不是,只是把我脑海中浮现的一些东西扔掉了。

编辑:

通过将 thin--ssl 开关结合使用,我已经能够在开发环境中在本地测试该场景。服务器启动后,我浏览到

https://localhost:3000

没有问题。一旦 Devise session 过期,任何 json 请求都会触发重定向以登录,如预期的那样并通过 http 工作。

所以这个问题中描述的问题只出现在我的服务器上,并且可能与我的 NGINX 配置设置方式有关。

我还将在本地预编译应用程序并使用 prod 环境选项运行,只是为了确保它与 dev 和 prod 之间的区别无关。

最佳答案

哇,事实证明这与 Devise session 超时、Rails 或 ExtJS 无关。

最终通过调整 NGINX 配置解决了这个问题,根据文档,这对于所使用的版本来说应该是正确的,但结果却导致了这个问题。

当前 ssl 服务器位:

server {
listen 443;
ssl on;
ssl_certificate /srv/ssl/server.myapp.com.combined.crt;
ssl_certificate_key /srv/ssl/server.myapp.com.key;
server_name server.myapp.com;
root /var/www/myapp/current/public;
passenger_enabled on;
rails_env myapp_staging;
}

之前我有:

server {
listen 443 ssl;
ssl_certificate /srv/ssl/server.myapp.com.combined.crt;
ssl_certificate_key /srv/ssl/server.myapp.com.key;
server_name server.myapp.com;
root /var/www/myapp/current/public;
passenger_enabled on;
rails_env myapp_staging;
}

区别在于 split

listen 443 ssl;

进入:

listen 443;
ssl on;

关于ssl - 意外的 302/从 HTTPS 重定向到 HTTP 导致 'insecure content' javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com