Nginx部署PHP API时返回无效Content-Type数据类型头问题求助
配置存在的核心问题
/API路径的转发目标错误:你当前location /API块内的try_files规则会将请求转发到站点根目录的/index.php,而非你预期的/API/index.php,请求未进入Nette框架的API处理逻辑,导致返回内容和响应头异常。
- 未兼容小写
/api路径匹配:当前仅配置了大写/API的前缀匹配,小写/api开头的请求会直接走根路径的规则,无法进入API处理逻辑。
- 未兼容小写
- 根路径规则适配错误(针对React静态资源托管):你当前根路径的
try_files回退到/index.php,如果根目录存放React打包后的静态资源,该规则会导致React前端路由失效,应该回退到index.html。
- 根路径规则适配错误(针对React静态资源托管):你当前根路径的
- PHP处理规则无目录限制:全局的
.php匹配规则允许站点任意目录下的PHP文件被执行,存在安全风险,建议将API目录下的PHP处理规则收敛到API的location块内。
- PHP处理规则无目录限制:全局的
修正后的完整配置
server { listen 443 ssl; listen [::]:443 ssl; server_name domain.tld *.domain.tld username.tld *.username.cz; # redirect other domains to main if ($host != 'domain.tld') { return 301 https://domain.tld$request_uri; } root /home/username/www/domain.tld/www; index index.html index.htm index.php; # 调整优先级,优先匹配静态资源入口 # 根路径适配React单页应用 location / { try_files $uri $uri/ /index.html; } # 大小写不敏感匹配所有/api开头的请求 location ~* ^/api { try_files $uri $uri/ /API/index.php$is_args$args; # 仅允许API目录下的PHP文件执行 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; } } # 如果你根目录确实有需要执行的PHP文件,可以保留这个块,否则可以删除 # location ~ \.php$ { # include snippets/fastcgi-php.conf; # fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; # } ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # managed by Certbot }
生效操作
修改配置后先执行nginx -t验证配置语法是否正确,确认无报错后执行systemctl reload nginx重载配置即可生效。
内容的提问来源于stack exchange,提问作者sjiamnocna
相关产品推荐
相关产品推荐

