php – Nginx在动态之前提供静态页面

我想用NGINX提供静态HTML文件,但如果文件丢失,应该加载一个PHP文件,PHP应该处理内容。

我一直在测试几个try_files的组合,但是我不能让我的头脑在周围。我有一个虚拟的PHP应用程序,如下所示:

./
../
dynamic.php
index.php
static/
static/static.html

那么我在这个索引上有一个小PHP代码:

<?php

$path = $_SERVER['REQUEST_URI'];
$pattern = '/^\/(.*)\.html$/';

$matches = [];

$results = preg_match($pattern, $path, $matches);

if (count($matches) > 0) {
    if ($matches[1] == "dynamic") {
        require 'dynamic.php';
    } else {
        echo "Not found!";
    }
} else {
    echo "Index page!";
}

浏览每个页面的结果应该是:

http://foo.bar/             - Loads index.php
http://foo.bar/static.html  - Loads static/static.html
http://foo.bar/dynamic.html - Loads index.php & PHP requires dynamic.php
http://foo.bar/baz.html     - Loads index.php with "not found" message

这是我在NGINX配置文件中得到的:

server {
    listen 80;
    server_name .foo.bar *.foo.bar;

    access_log /var/log/nginx/foo.access.log;
    error_log  /var/log/nginx/foo.error.log;

    root /var/www/foo;
    index index.php;

    location / {
        # Trying with 'try_files' here. No success.
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm-foo.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

我一直在尝试,显然完全失败了这一行:

try_files $uri $uri/static /index.php;

我错过了一些东西帮帮我?

我将使用您的静态目录作为文档根目录。这确保没有人可以直接执行/dynamic.php,但是它将被命名的位置块@php转发到你的index.php。

This configuration example is untested!

server {
    index       index.php;
    root        /var/www/foo/static;
    server_name foo.bar *.foo.bar;

    location / {
        try_files $uri @php;
    }

    location @php {
        include fastcgi_params;

        fastcgi_pass  unix:/var/run/php5-fpm-foo.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/foo/index.php;
    }
}

>如果只包含80,则不需要listen指令,因为这是默认值。
> server_names不应包含前导点。
> $ uri始终包含请求的URI,包括主要的斜杠(例如/static.html),并且nginx将在调用try_files(例如/var/www/foo/static.html)时将其与文档根前缀。因此,您需要在$ uri之前设置静态目录(例如/ static $ uri变为/var/www/foo/static/static.html)。
>您不需要fastcgi_split_path_info,因为您没有使用该功能。
>您的PHP位置的try_files使得nginx无法正确地转发内容。对/dynamic.html的请求不以.php结尾,因此try_files始终失败。

http://stackoverflow.com/questions/36803798/nginx-to-serve-static-page-before-dynamic

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – Nginx在动态之前提供静态页面