我希望 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 指令)决定接下来会发生什么。
还要确保设置了根目录。如果将根目录设置为 /,则非常危险,因为您会将系统根目录开放给不该访问的文件。