- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用Varnish 4作为网站上的反向代理缓存。但是我注意到,当使用查询字符串参数调用url时,它将绕过 Varnish 缓存。
例如:
# Normalize request url parameters before determining a page match.
set req.url = regsuball(req.url, "((\?)|&)(gclid|gclsrc|utm_content|utm_term|utm_campaign|utm_medium|utm_source|_ga)=[^&]*", "");
set req.url = regsub(req.url, "(\?&|\?|&)$", "");
vcl 4.0;
import std;
# The minimal Varnish version is 4.0
# For SSL offloading, pass the following header in your proxy server or load balancer: 'X-Forwarded-Proto: https'
backend default {
.host = "127.2.0.1";
.port = "80";
.first_byte_timeout = 6s;
}
acl purge {
"localhost";
}
sub vcl_recv {
if (req.method == "PURGE") {
if (client.ip !~ purge) {
return (synth(405, "Method not allowed"));
}
# To use the X-Pool header for purging varnish during automated deployments, make sure the X-Pool header
# has been added to the response in your backend server config. This is used, for example, by the
# capistrano-magento2 gem for purging old content from varnish during it's deploy routine.
if (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
return (synth(400, "X-Magento-Tags-Pattern or X-Pool header required"));
}
if (req.http.X-Magento-Tags-Pattern) {
ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
}
if (req.http.X-Pool) {
ban("obj.http.X-Pool ~ " + req.http.X-Pool);
}
return (synth(200, "Purged"));
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
# We only deal with GET and HEAD by default
if (req.method != "GET" && req.method != "HEAD") {
return (pass);
}
# Bypass shopping cart, checkout and search requests
if (req.url ~ "/checkout" || req.url ~ "/catalogsearch") {
return (pass);
}
# Bypass health check requests
if (req.url ~ "/pub/health_check.php") {
return (pass);
}
# Set initial grace period usage status
set req.http.grace = "none";
# normalize url in case of leading HTTP scheme and domain
set req.url = regsub(req.url, "^http[s]?://", "");
# Normalize request url parameters before determining a page match.
# strip normalized parameters from query string
set req.url = regsuball(req.url, "((\?)|&)(gclid|gclsrc|utm_content|utm_term|utm_campaign|utm_medium|utm_source|_ga)=[^&]*", "");
set req.url = regsub(req.url, "(\?&|\?|&)$", "");
# collect all cookies
std.collect(req.http.Cookie);
# Compression filter. See https://www.varnish-cache.org/trac/wiki/FAQ/Compression
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
# No point in compressing these
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
set req.http.Accept-Encoding = "deflate";
} else {
# unkown algorithm
unset req.http.Accept-Encoding;
}
}
# Static files caching
if (req.url ~ "^/(pub/)?(media|static)/") {
# Static files should not be cached by default
return (pass);
# But if you use a few locales and don't use CDN you can enable caching static files by commenting previous line (#return (pass);) and uncommenting next 3 lines
#unset req.http.Https;
#unset req.http.X-Forwarded-Proto;
#unset req.http.Cookie;
}
return (hash);
}
sub vcl_hash {
if (req.http.cookie ~ "X-Magento-Vary=") {
hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
}
# For multi site configurations to not cache each other's content
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
# To make sure http users don't see ssl warning
if (req.http.X-Forwarded-Proto) {
hash_data(req.http.X-Forwarded-Proto);
}
}
sub vcl_backend_response {
set beresp.grace = 3d;
if (beresp.http.content-type ~ "text") {
set beresp.do_esi = true;
}
if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "text") {
set beresp.do_gzip = true;
}
if (beresp.http.X-Magento-Debug) {
set beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
}
# cache only successfully responses and 404s
if (beresp.status != 200 && beresp.status != 404) {
set beresp.ttl = 0s;
set beresp.uncacheable = true;
return (deliver);
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.uncacheable = true;
set beresp.ttl = 86400s;
return (deliver);
}
# validate if we need to cache it and prevent from setting cookie
if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) {
unset beresp.http.set-cookie;
}
# If page is not cacheable then bypass varnish for 2 minutes as Hit-For-Pass
if (beresp.ttl <= 0s ||
beresp.http.Surrogate-control ~ "no-store" ||
(!beresp.http.Surrogate-Control &&
beresp.http.Cache-Control ~ "no-cache|no-store") ||
beresp.http.Vary == "*") {
# Mark as Hit-For-Pass for the next 2 minutes
set beresp.ttl = 120s;
set beresp.uncacheable = true;
}
return (deliver);
}
sub vcl_deliver {
set resp.http.X-Magento-Cache-Debug-Request-Url = req.url;
if (resp.http.X-Magento-Debug) {
# set the normalized request url as a http header if magento is in debug mode for easy debugging
if (resp.http.x-varnish ~ " ") {
set resp.http.X-Magento-Cache-Debug = "HIT";
set resp.http.Grace = req.http.grace;
} else {
set resp.http.X-Magento-Cache-Debug = "MISS";
}
} else {
unset resp.http.Age;
}
# unset resp.http.X-Magento-Debug;
# unset resp.http.X-Magento-Tags;
# unset resp.http.X-Powered-By;
# unset resp.http.Server;
# unset resp.http.X-Varnish;
# unset resp.http.Via;
# unset resp.http.Link;
}
sub vcl_hit {
if (obj.ttl >= 0s) {
# Hit within TTL period
return (deliver);
}
if (std.healthy(req.backend_hint)) {
if (obj.ttl + 300s > 0s) {
# Hit after TTL expiration, but within grace period
set req.http.grace = "normal (healthy server)";
return (deliver);
} else {
# Hit after TTL and grace expiration
return (fetch);
}
} else {
# server is not healthy, retrieve from cache
set req.http.grace = "unlimited (unhealthy server)";
return (deliver);
}
}
最佳答案
也许以下将为您更好地工作:
if (req.url ~ "(\?|&)(gclid|utm_[a-z]+)=") {
set req.url = regsuball(req.url, "(gclid|utm_[a-z]+)=[-_A-z0-9+()%.]+&?", "");
set req.url = regsub(req.url, "[?|&]+$", "");
}
关于caching - Varnish 4 VCL- strip 定义的查询字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47376776/
如标题所述。我可以使用 strip --strip-all 它将所有符号从 .ko 文件中去除。但是,如果我尝试使用 strip --strip-symbol=symbolname 仅删除一个符号,它
我正在使用 BeautifulSoup 在 Python 中完成抓取任务,但遇到了一些奇怪的错误。它提到了 strip,我没有使用它,但我猜可能与 BSoup 的进程有关? 在我试图转到原始 url
简单的问题。如何在 iReport 中的现有 strip 之间插入细节 strip ?比如我现在的情况: 细节 1 细节2 细节 3 ...我想在细节 2 和细节 3 之间添加另一个细节带。有什么简单
我的 strip 仪表板上不断收到错误代码 400。似乎我不止一次使用相同的 strip 标记,这会产生错误。下面是我的代码。 Js: var handler = Stri
我有一个 Unicode 字符串,在开头和结尾有一些不间断的空格。使用 strip() 与 strip(string.whitespace) 时,我得到不同的结果。 >>> import string
我正在尝试制作许多“小倍数”图。 (旁白/背景)我有太多方面无法在单个图中显示,因此我需要手动将它们划分为单独的图。我希望我能通过想要的 ncol和 nrow至 facet_wrap它会根据我的需要制
我读了很多东西,发现这个配置有两个副作用: 使二进制大小更小 程序显示更好的调试崩溃 我正在为 iOS 构建程序,所以我希望我的二进制文件尽可能小。这个意思: 如果我设置 是 对于这两个配置,我的二进
https://plotly.com/python/strip-charts/ 中的第二个例子显示添加颜色(见下面的屏幕截图),但这也会自动在红色和蓝色点之间创建间距。 如何关闭它?如何确保我的点为分
如果二进制文件大小不是问题,使用 -g 而不是剥离要在性能关键环境中运行的二进制文件是否有任何缺点?我有很多磁盘空间,但二进制文件是 CPU 密集型的并且使用大量内存。二进制文件加载一次并存活数小时。
代码 library(ggplot2) library(dplyr) mydata = tribble( ~x, ~y, ~data, ~more, 0, 50, 'iris', 'this'
“复制期间的条调试符号”和“条链接的产品”选项之间有什么区别? 如果“复制期间的 strip 调试符号” =是,“ strip 链接产品” =否是什么意思? 是否可以将带有符号数据的应用程序上载到Ap
我使用以下代码使用 stripe.createToken 方法为银行帐户创建了一个 token 。 stripe.createToken('bank_account', { country: 'U
我正在尝试安装 imwheel,一个用于 linux 的鼠标配置客户端,当我在尝试安装该软件包时遇到此输出时,作为一个完全的菜鸟被难住了,因为我以前这样做过并且从未遇到过这个问题(我曾经使用 paca
使用 str.strip 可以通过两种方式在空白处进行分割。 。您可以发出不带参数的调用,str.strip(),默认使用空格分隔符,或者自己使用 str.strip(' ')< 显式提供参数。 但是
我正在构建一个蚊子docker镜像,当调用make install时遇到以下错误消息“安装:无法识别的选项:strip-program = strip”,请帮助,谢谢。 install -d /usr
我正在构建我想要生成发布版本的代码。但是,我也希望能够在 cores 崩溃时对其进行调试。 所以我读到可以使用带有调试符号的构建,然后生成运行 strip 的二进制文件的拷贝。然后,您可以使用剥离的二
我使用 TestFlight 进行远程崩溃报告。现在,我正在为此使用 Google Analytics。 TestFlight 建议禁用“复制期间剥离调试符号”和“剥离链接产品”。谷歌分析——没有。我
在将“复制过程中剥离调试符号”设置为"is"的情况下执行存档构建时,我收到警告“跳过复制阶段剥离,二进制代码已签名”。关于此问题,通常建议的线程解决方案是将“复制期间剥离调试符号”设置为“否”。当然可
在现代linux中,几乎所有对象都被剥离并分为两部分(两个文件)。第一个是可执行文件本身,第二个是调试符号,从原始ELF中删除。这样的文件是用 objcopy --only-keep-debug or
我定义了三 Stripe 计划(免费、普通、高级)。当用户想要升级(例如从普通用户到高级用户)时,用户应该使用高级计划获得新订阅。 到目前为止,这是我的代码: subscription = strip
我是一名优秀的程序员,十分优秀!