我尝试使用 Magento 2 安装 Varnish Cache。它似乎工作正常(虽然我仍然有一个无缓存需要查找和删除......)但我的.htaccess
“即将推出”页面的重定向不再起作用。
我有标准.htaccess
代码来将其他用户(我除外)重定向到我的即将推出的页面:
# MAINTENANCE-PAGE REDIRECT
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^xx\.xxx\.xxx\.xxx
RewriteCond %{REMOTE_ADDR} !^xx\.xxx\.xxx\.xxx
RewriteCond %{REMOTE_ADDR} !^xx\.xxx\.xxx\.xx
RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx
# RewriteCond %{REQUEST_URI} !coming/soon.html$ [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif|css|js|svg|eot|woff|woff2|php) [NC]
RewriteCond %{REQUEST_URI} !^/coming/soon\.html$
RewriteRule ^(.*)$ https://example.com/coming/soon.html [R=302,L]
</IfModule>
无需激活 Varnish Cache,此操作即可完美运行。启用 Varnish Cache 后,所有人(包括我)都会重定向到我的即将推出页面。
我尝试设置我的 varnish 缓存.vcl
文件来做同样的事情,但是我遇到了错误(有我的 IP 和没有 IP 的情况下),varnish 缓存页面为空白,并且我的 URL 出现错误 302 代码https://www.example.com/coming/soon.html
:
acl nosip {
"xx.xxx.xxx.xxx";
"xx.xxx.xx.xxx";
"xx.xxx.xxx.xx";
"xxx.xxx.xxx.xxx";
}
sub vcl_recv {
# Methode ip exclusion
if (client.ip !~ nosip) {
return (synth(302, "https://www.example.com/coming/soon.html"));
}
}
这是正确的做法吗?
答案1
Varnish 实现为反向代理在您的应用程序服务器前面,因此 REMOTE_ADDR
服务器变量(当它到达您的应用程序服务器时)很可能是该代理服务器的 IP 地址,而不是客户端的原始 IP。
假设 Varnish 设置了适当的X-Forwarded-....
请求标头,那么您可能需要检查X-Forwarded-For
HTTP 请求标头。例如:
RewriteCond %{HTTP:X-Forwarded-For} !^xx\.xxx\.xxx\.xxx
请注意,X-Forwarded-For
标头可能是以逗号分隔的 IP 地址字符串。经过的每个代理服务器的 IP 都附加在末尾。