gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:58:18 25 4
gpt4 key购买 nike

我想用 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,但是,它将通过命名位置 block @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;
}
}
  1. 如果 listen 指令只包含 80,则不需要,因为这是默认值。
  2. server_name不应包含前导点。
  3. $uri 始终包含请求的 URI,包括前导斜杠(例如 /static.html),并且 nginx 会在调用 时为它们加上文档根目录>try_files(例如 /var/www/foo/static.html)。因此,您需要在 $uri 之前设置 static 目录(例如 /static$uri 变为 /var/www/foo/static/static.html)。
  4. 您不需要 fastcgi_split_path_info,因为您没有使用该功能。
  5. 您的 PHP 位置中的 try_files 使 nginx 无法正确转发内容。 /dynamic.html 的请求不会在 .php 结束,因此 try_files 总是失败。

关于php - Nginx 在动态之前提供静态页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36803798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com