HTTPS环境下phpMyAdmin一个很奇怪的问题
今天给我自己的VPS配置上了SSL证书,于是想把phpMyAdmin的强制SSL打开,可是打开之后发现一个很奇怪的问题,具体描述如下:
- 首页完全是空白
- 首页的源代码是有内容的,而且是正确的
- Chrome的开发者控制台能看到所有的CSS、JS请求全挂了。(failed) Pending
- 双击打开这些请求,可以完全正常的看到所有的CSS和JS
- 从日志可以看出客户端完全没有发起对那些没有加载的CSS和JS的请求。
请问这样的问题该如何解决呢。。。
个人认为与
<style>html{display: none;}</style>
没有直接的关系。因为http下加载了所有的CSS之后,会有新的CSS覆盖着一条,所以可以正常显示。如果在HTTPS下,由于某些CSS无法正常加载,才导致了这一条直接生效,导致页面全白。
应要求贴上httpd的ssl配置。
Listen 443
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /***/ssl.crt
SSLCertificateKeyFile /***/ssl.key
SSLCertificateChainFile /***/gs_intermediate_ca.pem
SSLCACertificateFile /***/ca.pem
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
在@HJin.me 的提醒下找到一点头绪,确实是SPDY的问题。如果把SPDY关掉,那就完全正常。但是还木有找到最终的原因。
然后多次试验发现了一个更加奇怪的问题。有的时候我在服务端日志上完全看不到访问记录,说明Chrome的请求完全没有发到服务端。但是有的时候,我能在服务端看到请求到达,并且返回200,可是Chrome依然显示(failed) Pending。但是这时候如果点一下这个请求,会发现右边打开的窗口中显示的HTTP状态码是200!这真是太奇怪了。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可能你的问题早就解决了,不过我刚好遇到一个相同的问题,所以顺便跟一下这个问题。(可能答不对题了,因为我用的是nginx,而且js并没load失败,答案留作一种相关参考吧)
现象
经历
<style>html{display: none;}</style>
这个奇怪的样式了,第一反应式被注入了,很快发现,这个是phpmyadmin本身的作法,问题不在这里/js/get_scripts.js.php
请求,终于发现问题:内容输出不完整。正是因为JS的内容输出不完整,导致后续一系列JS错误,页面样式也就无法正常设置了。问题原因
Nginx的fastcgi_temp目录权限错误,nginx子进程(worker process; master进程是root账户下运行的,但是所有的worker进程是根据nginx配置文件的user账户下运行的)无法进行写入。我突然想起来不久前曾经改过目录权限。
问题解决
知道了原因解决就简单了,我的nginx user配置是www:www,改下fastcgi_temp目录权限就好了:
深入理解
Nginx有一个buffer机制,对于来自FastCGI服务的Response,Nginx将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制,当FastCGI的返回内容的大小在buffer限制之内的,会写入内存,然后发送到客户端;但是超过之后,就会写入磁盘缓存,写入的目录就是fastcgi_temp目录。这个目前无法写入的话,导致nginx无法继续缓冲FastCGI的返回,最终只将内存中缓冲的部分数据输出到了客户端。稍后写一篇博文详细总结一下相关问题。
因为你所有的静态资源CSS和JS走的都是http端口,chrome会认为这是不安全因素,所以默认不加载它们。你需要设置让静态资源也走https,具体在哪设置我还没找到,不过应该就是这个原因。
更新下:
我在html代码里发现了这样一句
所有的样式都隐藏了,当然显示不出来
有可能是open_basedir配置的有问题。
http://www.51ask.org/article/305