首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Nginx为静态页面提供先于动态的服务

Nginx为静态页面提供先于动态的服务
EN

Stack Overflow用户
提问于 2016-04-23 05:46:11
回答 2查看 4.8K关注 0票数 22

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

我已经测试了try_files的几种组合,但我无法理解它。我有一个虚拟的PHP应用程序,看起来像这样:

代码语言:javascript
复制
./
../
dynamic.php
index.php
static/
static/static.html

然后我在索引上有一小段PHP代码,如下所示:

代码语言:javascript
复制
<?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!";
}

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

代码语言:javascript
复制
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配置文件中得到的:

代码语言:javascript
复制
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;
    }
}

我一直在反复尝试,但显然完全失败了:

代码语言:javascript
复制
try_files $uri $uri/static /index.php;

我遗漏了一些东西。帮助?

EN

回答 2

Stack Overflow用户

发布于 2016-04-23 19:26:41

有许多方法可以隐藏static目录。例如,操纵root,巧妙地使用try_filesrewrite

最明显的可能是:

代码语言:javascript
复制
root /var/www/foo;

location / {
    root /var/www/foo/static;
    try_files $uri /index.php;
}

location ~ \.php$ { ... }

因此,nginxstatic文件夹中查找普通文件,但在父文件夹中查找.php文件。

你试图实现的东西是这样的:

代码语言:javascript
复制
root /var/www/foo;

location / {
    try_files /static$uri /index.php;
}

location ~ \.php$ { ... }

它将在测试是否存在之前将/static作为任何URI的前缀。/index.php必须是最后一个元素,因为它需要在不同位置进行处理。有关详细信息,请参阅this document

票数 7
EN

Stack Overflow用户

发布于 2016-05-29 06:27:32

根据您给出的具体示例,下面的配置将返回您列出的结果。

代码语言:javascript
复制
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 ~ \.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;
    }

    location ~ /static {
        rewrite ^/static\.html$ /static/ last;
        index static.html;
    }
    location ~ / {
        rewrite ^ /index.php last;
    }

那是..。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36803798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档