Nginx - 提供 .htm(如果存在)而不是 .php

Nginx - 提供 .htm(如果存在)而不是 .php

我希望减少服务器的负载。

我已经设置好了 php 文件,所以每当有人第一次访问某个特定页面时,它都会将 html 输出缓存到我的 /cache 文件夹中的 whatever.htm 文件中。

我使用 nginx 作为我的 apache 服务器(仅提供 php 文件)的“前端”。

是否可以设置 nginx 以便:

1) 如果请求了 index.php,则首先检查 /cache 文件夹中是否存在 index.htm - 如果存在,则改为提供该页面。如果不存在,则将请求传递给 apache。

2) 我只希望 nginx 检查缓存文件夹中的特定文件名集(而非所有 php 文件)——可以通过这种方式设置数组或类似内容吗?(仅检查 index.php、contact.php、faq.php 等请求的缓存)

3) 如果提供 .htm“缓存”文件,是否可以使其看起来仍然提供 .php 文件?我只是不希望扩展在地址栏中显示 .htm,并开始出现搜索引擎重复内容问题。

任何帮助,将不胜感激!

答案1

好吧,因为你的应用程序自己控制缓存文件,所以你可以使用try_files指示:

location ~ \.php$ {
  try_files /cache/$uri.html @php;

  # the directives below will affect cache serving
}

location @php {
  # pass to FastCGI or Apache proxy for PHP rendering
}

对于对此的请求,whatever.php将检查是否cache/whatever.php.html存在,如果存在则返回。否则,请求将转到 PHP。

选择。坦率地说,这种方法是可行的,但它相当冗长,如果你决定绕过某些请求的缓存,它会更加冗长。例如,如果有一个参数,你想直接转到 PHP,该怎么办debugwhatever.php?debug

Nginx 对此问题有一个很好的答案,即其内置缓存。假设您使用 FastCGI 来提供 PHP,则 Nginx 配置将如下所示:

# you have to declare a cache at "http" level
http {
  fastcgi_cache_path   /path/to/cache  levels=1:2
                       keys_zone=my_cache_id:10m
                       inactive=5m;
}

# server level
location / {
  fastcgi_cache my_cache_id;

  # cache HTTP replies with statuses 200, 302 for 5 minutes:
  fastcgi_cache_valid 200 302 5m;

  # do not cache if there is a "debug" argument or PHP returned HTTP header Pragma:
  fastcgi_no_cache $arg_debug$http_pragma;

  # other FastCGI directives...
  fastcgi_pass localhost:9000;
}

Nginx 文档是这里

相关内容