gpt4 book ai didi

nginx - 基于 nginx 中的动态 Content-Type 使 header 过期

转载 作者:行者123 更新时间:2023-12-01 17:58:04 28 4
gpt4 key购买 nike

我有一个 PHP 网站,其中一些内容是用户生成的。例如,用户可以上传调整大小并可以请求的照片。我想根据 nginx 配置中的 MIME 类型(Content-Type 响应 header )指定一个 Expires header (用于缓存)。

这是我当前的配置(我的主机自动添加 http{}server{}):

charset utf-8;

types {
text/css css;
text/javascript js;
}

gzip on;
gzip_types text/html text/css text/javascript application/json image/svg+xml;

location / {
if (!-e $request_filename) {
rewrite . /index.php last;
break;
}


set $expire 0;

if ($upstream_http_content_type = image/jpeg) { set $expire 1; }
if ($upstream_http_content_type = image/png) { set $expire 1; }
if ($upstream_http_content_type = image/gif) { set $expire 1; }
if ($upstream_http_content_type = image/svg+xml) { set $expire 1; }
if ($upstream_http_content_type = text/css) { set $expire 1; }
if ($upstream_http_content_type = text/javascript) { set $expire 1; }

if ($expire = 1) {
expires max;
}
}

这适用于静态文件(例如 .png 文件 - 它们获得正确的 Expires header ),但对从 index 动态生成的内容没有影响.php (根本没有 Expires header )。有人知道我做错了什么吗?

最佳答案

在您的 location block 中,当您将请求传递给 php Web 应用程序时,没有任何地方,因此我可以假设您在其他地方执行此操作,例如在 location block 中,例如这个:

location /index.php {
# your code
}

根据您的配置,当用户请求存在的静态文件时,不会计算第一个 if 指令,一切顺利。当用户请求动态文件然后 nginx 输入您的第一个 if block 时,问题就开始了:

if (!-e $request_filename) {
rewrite . /index.php last;
break;
}

这里发生了什么?您正在将 last 标志与 rewrite 指令一起使用,nginx 的文档对此有何评论?

last - 完成当前重写指令的处理,并通过从所有可用位置搜索 URI 上的匹配项来重新启动进程(包括重写)。

根据此规范,当文件是动态的时,您对 index.php 进行了重写,并且执行留下 if block 甚至整个 location block 甚至没有检查用于检查 content-type 的以下 if block 。我想它会找到 url /index.phplocation 并且您没有设置 expires max

你明白你的问题的这种解释吗?

对此的解决方案是移动/复制用于检查 content-type 的连续 if block ,以将配置传递执行到 php web 应用程序 (index.php) ...或者从 rewrite 指令中删除 last 标志(如果它不会造成任何其他麻烦)。

好吧,正如我 promise 对您的conf文件进行一些修复:用这两个更改您的location block :

location /index.php {
if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
expires max;
}
if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
expires max;
}
}

location / {
if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
expires max;
}
if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
expires max;
}
try_files $uri /index.php =404;
}

第一个 location block 用于您的 index.php 和动态响应,而第二个用于静态文件。在第二个中,我们添加 header expires max 作为上游 header 和标准 header (只是为了确定)。我在这里使用一个 if block 来表示您在配置中使用正则表达式模式匹配定义的所有类型。最后我们使用 try_files 指令,这意味着如果可以根据 url 获取静态文件,则将获得该静态文件,并以其他方式尝试 url/index.php 或仅返回 http 404。第一个位置 block 仅适用于 url /index.php。我在你的配置 root 指令中找不到任何应该指向应用程序根文件夹的地方。尝试也添加这个( root doc )。

关于nginx - 基于 nginx 中的动态 Content-Type 使 header 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631044/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com