根据nginx中的动态内容类型终止标头

根据nginx中的动态内容类型终止标头,nginx,http-headers,content-type,http-caching,expires-header,Nginx,Http Headers,Content Type,Http Caching,Expires Header,我有一个PHP网站,其中一些内容是用户生成的。例如,用户可以上传调整大小并可请求的照片。我想根据nginx配置中的MIME类型(Content-typeresponse-header)指定一个Expires头(用于缓存) 这是我当前的配置(我的主机自动添加http{}和server{}): 这适用于静态文件(如.png文件-它们获得正确的Expires标题),但对从index.php动态生成的内容没有影响(根本没有Expires标题)。有人知道我做错了什么吗?在您的位置块中,当您将请求传递给ph

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

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


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

在您的
位置
块中,当您将请求传递给php web app时,没有任何位置,因此我可以假设您在其他位置执行此操作,例如在
位置
块中,如下所示:

location /index.php {
   # your code
}
当用户请求一个存在的静态文件时,如果没有计算指令并且一切正常,则首先使用您的配置。当用户请求动态文件时,问题开始出现,然后nginx输入您的第一个
if
块:

if (!-e $request_filename) {
    rewrite  .  /index.php last;
    break;
} 
这里发生了什么?您正在将
last
标志与
rewrite
指令一起使用,nginx的文档对此有何说明

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

根据此规范,当文件处于动态状态时,您对
index.php
进行了一次重写,执行时会留下
if
块,甚至整个
位置
块,用于检查
内容类型的后续
if
块甚至未被检查。我想它会找到url
/index.php
位置
,在那里您不会设置
expires max

你明白你对问题的解释吗

解决这个问题的方法太简单了:移动/复制用于检查内容类型的顺序
if
块,将配置执行传递到php web app(index.php)的位置。。。或者从
rewrite
指令中删除
last
标志,如果它没有产生任何其他问题

好的,正如我所承诺的,对conf文件进行一点修复:使用以下两种方法更改
位置
块:

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
块用于
index.php
和动态响应,而第二个块用于静态文件。在第二个中,我们添加了头
expires max
作为上游头和标准头(只是为了确保)。我在这里使用一个
if
块,用于配置中使用regex模式匹配定义的所有类型。最后,我们使用
try_files
指令,这意味着如果有可能根据url获取静态文件,则将获取该文件,并以其他方式尝试url/index.php或仅使用http 404返回。第一个位置块仅用于url
/index.php
。 我在config
root
指令中找不到应该指向应用程序根文件夹的内容。也尝试添加这个()


我希望这能解决您的问题。

什么是动态文件?你的意思是当用户上传真实文件(例如图像)并且你的web应用程序传输它(例如调整大小)并将其发送回时,就会出现动态文件,是吗?@emka86我更改了问题以澄清这一部分。我指的是由
index.php
动态生成的内容。我检查了您的conf屏幕截图,从我的角度来看,它是不可能工作的。您没有任何
root
指令,因此nginx甚至不知道从哪里开始搜索任何文件。接下来,您将使用
index.php
但没有任何
proxy\u pass
fastcgi\u pass
指令将nginx请求重定向到某个php应用程序。Nginx自己不知道如何处理
.php
文件。请检查一下这两个问题:或者我知道已经太晚了,但是看看这个答案。谢谢你的解释。我部分理解这个问题。然而,这是我第一次使用nginx,我没有足够的经验来提出解决方案。我现在已经将我的整个配置粘贴到问题中;你介意再看一眼,看看我该换什么吗?再次感谢!真的是整件事吗?没有更多的
位置
块?您的应用程序没有按您预期的那样工作,仅在
过期时才出现此问题?是的,仅此而已。My
index.php
读取请求的路径并从那里处理所有内容(这就是为什么对不存在的文件/文件夹的所有请求都会重写为
index.php
)。除了
Expires
标题外,它工作得很好。用PHP处理大多数事情的原因是,该项目不仅在nginx上运行,而且在Apache上运行。出于这个原因,我喜欢在HTTP服务器配置中尽可能少做一些事情。好的,我将尝试给你一些答案,不仅描述你的问题,而且解决它:)谢谢你的更新。如果我从自己的配置中删除
location{}
块并粘贴到您的代码中,
index.php
的源代码将在浏览
/
时输出,其他URL(通常由
index.php
处理)将获得404。我试着移动一些部件,改变一些东西,但我还是不能让它工作。也许我应该用PHP来处理这个问题(尽管我更喜欢让web服务器来完成)…
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;
}