我使用nginx
和codeigniter
为我的网站提供服务。当没有代理时,我可以正确地加载ssl站点。
但是,当代理后面的计算机试图访问它时,就会出现409
冲突。
它能够在代理后面正确地加载非ssl站点。
以下是nginx-conf:中的ssl代码块
Pastie Nginx Conf
奇怪的是,当我直接打开css或js文件(例如,在浏览器中键入css url)时,它会正确加载它
以下是返回409
冲突的资产的响应+请求标头。
请求标头:
Accept:text/css,*/*;q=0.1
Accept-Encoding:gzip,deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:ci_session=ca41f4c9930b678f07acb9a45c839b63
Host:www.mywebsite.com
If-Modified-Since:Wed, 24 Sep 2014 01:13:00 GMT
If-None-Match:"54221a9c-1da51"
Referer:https://www.mywebsite.com/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
响应标头:
Cache-Control:no-cache
Connection:close
Content-Length:1256
Content-Type:text/html; charset=utf-8
Pragma:no-cache
Proxy-Connection:close
当在FF中浏览时,它抛出以下内容:
An error occurred during a connection to www.mywebsite.com. Certificate type not approved for application. (Error code: sec_error_inadequate_cert_type)
提供静态资产不起作用。。
nginx文档和w3文档都可以让您更好地理解这个问题。似乎问题可能与通过代理传递请求时的冲突有关。这意味着代理正在更改请求参数。如果不查看和比较来自两个请求的日志,很难判断差异在哪里。
看看这些链接:
http://nginx.com/resources/admin-guide/nginx-ssl-termination/
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
还要确保你的CSS和JS请求可能在缓存方面有所不同,所以代理可能会保持请求的原样。
缓存似乎不是问题,因为看起来根本没有设置缓存。要设置缓存,您需要以下内容:位置~*。(ico|css|js|gif|jpe?g|png)(''?[0-9]+)?${过期最大值;log_not_found关闭;}
如果你查看nginxwiki上的示例CI配置,你会发现它有很大的不同。
这也可能是你在CI中的$config['base_url']
设置的问题。同样,在同一个nginxwiki页面上有更多信息。
更新响应:
首先,如果你把日志放在块中,你可能会得到更多的信息:
access_log /var/log/nginx/mywebserver.com_access.log;
error_log /var/log/nginx/mywebserver.com_error.log;
或者改变你想要的方式。
但是,看起来我们可能正在处理409
和sec_error_inadequate_cert_type
之间的两个不同错误。
409错误
因此,让我们先来看看409错误的可能原因:
409错误可能来自许多不同的地方,但这里有一个关于它的含义的快速说明:
由于与资源的当前状态冲突,无法完成请求。只有在期望用户能够解决冲突并重新提交请求的情况下,才允许使用此代码。
奇怪的是,这种情况经常发生在PUT请求中(这里可以将其视为EDIT冲突)。因此,一个问题可能是请求正在使CI重写这些文件,从而导致409。您也可以在WebDav中经常发现这个错误,这是有道理的。
它也可能与保活部分有关,因为它可能因此而以不同的方式生成资产,因此在编写新的资产时要求使用旧版本的资产。你也许可以修复即通过将CCD_ 8添加到服务器块。它也可能与连接/代理连接标头有关。以下是对Connection
和Proxy-Connection
标头的更多解读。
在重写常规请求时,代理可能存在问题。最好使用:CCD_ 11,其中一些原因与SEO有关,但它也可能在代理通过过程中丢失一些安全信息
sec_error_inadevale_cert_type
因此,FF有一段历史,当其他一些浏览器没有抛出这个错误时(基于错误报告)。它对Chrome也有同样的作用吗?
sec_error_inadevale_cert_type代码也可以指示许多不同的东西:
静态资产是否碰巧在SSL证书未涵盖的子域上提供服务?此外,您可能希望在服务器块中指示特定的ssl_protocols
和ssl_ciphers
。
这些可能不适用:ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;密码高:!aNULL:!MD5;
我已经研究了其他一些可能性,并将它们包含在下面的nginx配置示例中,该示例中还有一些可能有帮助的指令,所以看看下面的conf是否可行。
如果你在实现它们后在错误日志中发现了一些东西,或者如果有来自另一个浏览器的不同信息,那么请更新我。
server{
listen 80;
server_name www.mywebserver.com;
return 301 $scheme:/$server_name$request_uri;
}
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/www.mysite.com.SSL.crt;
ssl_certificate_key /etc/nginx/ssl/www.mysite.com.key;
server_name www.mysite.com;
index index.php;
root /home/user/workspace/;
## Access and error logs.
access_log /var/log/nginx/mywebserver.com_access.log;
error_log /var/log/nginx/mywebserver.com_error.log;
## Keep alive timeout set to a greater value for SSL/TLS.
keepalive_timeout 75 75;
## Strict Transport Security header for enhanced security. See
## http://www.chromium.org/sts.
add_header Strict-Transport-Security "max-age=7200";
location / {
try_files $uri $uri/ /index.php;
}
location ~ [^/]'.php(/|$) {
fastcgi_split_path_info ^(.+?'.php)(/.*)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/home/user/public_html$fastcgi_script_name;
include fastcgi_params;
}
location ~* .(ico|css|js|gif|jpe?g|png)('?[0-9]+)?$ {
gzip_static on;
expires max;
add_header ETag '';
add_header Last-Modified '';
add_header Cache-Control "max-age=290304000, no-transform, public";
add_header Accept-Ranges '';
tcp_nodelay off;
log_not_found off;
## Set the OS file cache.
open_file_cache max=3000 inactive=120s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
}
}