如果存在,则 Nginx 提供纯文本文件,否则提供 /index.php

如果存在,则 Nginx 提供纯文本文件,否则提供 /index.php

我希望 Nginx 能够自行处理所有静态文件请求,但如果文件不存在,则提供 index.php 来处理所有请求

目前我的配置如下,

server {
listen 80;
listen [::]:80;

root /home/www/example.com/htdocs;

index index.php;

server_name www.example.com;


location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.php
    try_files $uri $uri/ /index.php;
    #try_files /favicon.ico =404;
}


location / {
    add_header X-Is-PHP true;
            try_files /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
    }


}

这是我能得到的最接近的答案,它为任何静态文件请求提供服务,如果不存在,则将 index.php 作为纯文本文件提供。如何将 index.php 传递给 PHP 解释器?

答案1

尝试这个

服务器 {
听80;
听 [::]:80;

根/home/www/example.com/htdocs;

索引索引.php;

服务器名称www.example.com;


位置 ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ {
    # 首先尝试以文件形式提供请求,然后
    # 作为目录,然后返回到 index.php
    尝试文件$uri $uri/ /index.php;
    #try_files/favicon.ico =404;
}

错误页面 404 /index.php;

位置 ~ \.php$ {
            添加标题 X-Is-PHP true;
            #try_files $uri =404;
            尝试文件/index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # 使用 php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index索引.php;
            包括 fastcgi.conf;
    }


}

变化

1)添加了error_page 404 /index.php;以便所有在服务器上找不到的请求都重定向到index.php

2) 在位置属性中添加“~.php$”。

3)如果您希望其他 PHP 文件也进行解释,请取消注释行“#try_files $uri =404;”并注释行“try_files /index.php =404;”

答案2

location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php; } }

答案3

老实说,你不应该使用 If。NGINX 网站上的手册中甚至提到了这一点。如果文件存在,实现提供该文件的一种好方法是正确使用 try_files。下面是我提供的示例。

set $base_root /webhosts/website.com/webroot;
root $base_root;

#if file exists then serve it. Else Fallback to @php location directive
location / {
    try_files $uri $uri/ @php;
}

location @php { 
    rewrite ^/(.+)$ /index.php?/$1 last;
}

上面的例子只是使用了我需要的重写规则。您应该使用 try_files 并让第三个参数(Fallback 指令)决定接下来会发生什么。

还要确保设置了根目录。如果将根目录设置为 /,则非常危险,因为您会将系统根目录开放给不该访问的文件。

相关内容