我想用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;
我遗漏了一些东西。帮助?
发布于 2016-04-23 19:26:41
有许多方法可以隐藏static
目录。例如,操纵root
,巧妙地使用try_files
或rewrite
。
最明显的可能是:
root /var/www/foo;
location / {
root /var/www/foo/static;
try_files $uri /index.php;
}
location ~ \.php$ { ... }
因此,nginx
在static
文件夹中查找普通文件,但在父文件夹中查找.php
文件。
你试图实现的东西是这样的:
root /var/www/foo;
location / {
try_files /static$uri /index.php;
}
location ~ \.php$ { ... }
它将在测试是否存在之前将/static
作为任何URI的前缀。/index.php
必须是最后一个元素,因为它需要在不同位置进行处理。有关详细信息,请参阅this document。
发布于 2016-05-29 06:27:32
根据您给出的具体示例,下面的配置将返回您列出的结果。
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;
}
那是..。
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
https://stackoverflow.com/questions/36803798
复制相似问题