在负载均衡器后面覆盖nginx中的$ scheme

我有一个负载均衡器后面的nginx服务器。 负载均衡器处理SSL终止,所有请求都在端口80上触发 nginx。我还使用SRCache模块使用Redis进行完整页面caching。 caching模块使用URL作为caching键,如$schemeGET$host$request_uri 。 我以为我可以重写Nginx的$schemevariables,所以caching密钥scheme将是https而不是http我不知道如何做,或者甚至可能。

我的应用程序caching各种事件后清除caching,它使用https生成caching键,但nginxcaching使用caching中的http键。 这意味着由于caching键名称不匹配,未正确清除caching。

这是我的网站configuration,如果有帮助:

 server { listen 80; server_name example.com example.org example.net ; set $redirect_to_https 0; if ( $http_x_forwarded_proto != 'https' ) { set $redirect_to_https 1; } if ( $request_uri = '/health-check.php' ) { set $redirect_to_https 0; } if ( $redirect_to_https = 1 ) { return 301 https://$host$request_uri; } # Uncomment the following line for domain mapping server_name_in_redirect off; access_log /var/log/nginx/example.com.access.log rt_cache_redis; error_log /var/log/nginx/example.com.error.log; root /var/www/example.com/htdocs; index index.php index.html index.htm; include common/redis-php7.conf; include common/wpcommon-php7-modified.conf; include common/locations-php7.conf; include /var/www/example.com/conf/nginx/*.conf; } 

更新这里是cachingconfiguration

 # Redis NGINX CONFIGURATION # DO NOT MODIFY, ALL CHANGES LOST AFTER UPDATE EasyEngine (ee) set $skip_cache 0; # POST requests and URL with a query string should always go to php if ($request_method = POST) { set $skip_cache 0; } if ($query_string != "") { set $skip_cache 1; } # Don't cache URL containing the following segments if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|wp-.*.php|index.php|/feed/|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") { set $skip_cache 1; } # Don't use the cache for logged in users or recent commenter if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { set $skip_cache 1; } # Use cached or actual file if they exists, Otherwise pass request to WordPress location / { try_files $uri $uri/ /index.php?$args; } location /redis-fetch { internal ; set $redis_key $args; redis_pass redis; } location /redis-store { internal ; set_unescape_uri $key $arg_key ; redis2_query set $key $echo_request_body; redis2_query expire $key 14400; redis2_pass redis; } location ~ \.php$ { set $key "nginx-cache:$scheme$request_method$host$request_uri"; try_files $uri =404; srcache_fetch_skip $skip_cache; srcache_store_skip $skip_cache; srcache_response_cache_control off; set_escape_uri $escaped_key $key; srcache_fetch GET /redis-fetch $key; srcache_store PUT /redis-store key=$escaped_key; more_set_headers 'X-SRCache-Fetch-Status $srcache_fetch_status'; more_set_headers 'X-SRCache-Store-Status $srcache_store_status'; include fastcgi_params; fastcgi_pass php7; } 

好的,在这里我们看到你的caching键用于redis查找:

 location ~ \.php$ { set $key "nginx-cache:$scheme$request_method$host$request_uri"; 

问题是$scheme反映了nginx与你的负载平衡器的连接,但是你的caching模块正在使用来自$http_x_forwarded_proto的scheme,这个scheme反映了正在使用的实际scheme。

只要做出这样的改变就足够了。