Nginx – 服务.htm(如果存在),而不是.php

我正在寻找减less我的服务器上的负载。

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

我使用nginx作为我的apache服务器(它只服务于php文件)的“前端”。

是否有可能设置nginx,以便:

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

2)我只喜欢nginx检查caching文件夹只为一组特定的文件名(不是所有的PHP文件) – 可以设置一个数组或类似的东西? (只检查caching的index.php,contact.php,faq.php等请求)

3)如果服务一个.htm“caching”文件,有可能使它看起来像仍然服务于.php文件? 我只是不希望扩展名在地址栏中显示.htm,并开始与search引擎重复的内容问题。

任何帮助,将不胜感激!

那么,由于你的应用程序自己控制你的caching文件,你可以使用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 } 

对于一个请求,这将检查是否存在cache/whatever.php.html并返回它,如果它。 否则,请求会转到PHP。

另类 。 坦率地说,这个方法可以工作,但是如果你决定绕过某些请求的caching,它会变得更加冗长。 例如,如果你想直接去PHP,如果有一个debug参数: whatever.php?debug

对于这个问题,Nginx有一个很好的答案,它的内置caching。 假设您正在使用FastCGI来为PHP提供服务,那么Nginxconfiguration将如下所示:

 # 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的文档在这里