我有一个反应应用程序的nginx配置。然而,我还想包含一个我用php动态构建的sitemap.php。
所以这是我的nginx配置:
server {
listen 80;
listen [::]:80;
server_name mysite.com;
index index.html index.htm;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location /sitemap.xml {
alias /var/www/web-app/public/sitemap.php;
}
location / {
root /var/www/web-app/public;
try_files $uri $uri/ /index.html;
default_type "text/html";
}
}
代码段文件由以下内容组成:
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
此外,它托管在Ubuntu 16.04 digitalocean VPS上。
我的反应应用程序仍然正常加载。它基于我的站点根目录中的index.html(/ var / www / web-app / public)。如果我将test.php放在公用文件夹中,我会收到404错误。对于我的sitemap.xml别名,它正确转发到sitemap.php(也在公共场合),但php不会呈现。
所以我的两个最大问题在这里: 1.为什么我在/mysite.com/test.php上获得404? 2.为什么我的php在它工作时不能渲染? (即sitemap.php)
答案 0 :(得分:1)
您缺少root
块的location ~ \.php$
语句,因此找不到您的PHP文件。由于这似乎是带root
块的常见location /
,只需将语句移至server
块范围:
root /var/www/web-app/public;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location / {
try_files $uri $uri/ /index.html;
default_type "text/html";
}
有多种方法可以将/sitemap.xml
重定向到/sitemap.php
,但rewrite...last
对用户来说最简单且不可见:
location = /sitemap.xml {
rewrite ^ /sitemap.php last;
}
location
语法见this document,rewrite
指令见this one。