Nginx配置alias指向单个PHP文件返回404(其他文件正常)
Nginx配置alias指向单个PHP文件返回404(其他文件正常)
我之前也踩过这个坑!其实问题出在Nginx的alias指令和FastCGI结合时的路径解析逻辑上,普通静态文件的alias逻辑没问题,但PHP文件需要经过PHP-FPM处理,参数配置稍有不慎就会导致404。
核心原因
当你用location /netbootassets/fragment.php匹配单个PHP文件时,虽然alias能正确映射静态文件路径,但FastCGI的SCRIPT_FILENAME参数可能没有被正确传递给PHP-FPM——要么是fastcgi-php.conf里的默认配置覆盖了你的设置,要么是变量解析时出现了路径偏差,导致PHP-FPM找不到实际的文件。
解决方法
这里给你两个靠谱的解决方案:
方案1:直接写死SCRIPT_FILENAME路径(最稳妥)
把SCRIPT_FILENAME直接指定为PHP文件的实际路径,同时给location加上=做精确匹配,避免其他规则干扰:
location = /netbootassets/fragment.php { alias /opt/easy_multi_pxe/scripts/fragment.php; include snippets/fastcgi-php.conf; # 直接指定实际文件路径,彻底避免变量解析问题 fastcgi_param SCRIPT_FILENAME /opt/easy_multi_pxe/scripts/fragment.php; fastcgi_pass unix:/run/php/php-fpm.sock; }
方案2:用$request_filename但调整参数顺序
如果你不想写死路径,可以保留$request_filename,但要把你的fastcgi_param配置放在include snippets/fastcgi-php.conf之后,确保覆盖默认配置:
location = /netbootassets/fragment.php { alias /opt/easy_multi_pxe/scripts/fragment.php; include snippets/fastcgi-php.conf; # 放在include之后,确保覆盖默认的SCRIPT_FILENAME设置 fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/run/php/php-fpm.sock; }
额外检查项
最后别忘了确认两个关键点:
- PHP-FPM运行的用户(比如常见的www-data)是否有读取
/opt/easy_multi_pxe/scripts/fragment.php的权限 - 检查文件路径的拼写,Linux系统路径是区分大小写的,别不小心写错了
备注:内容来源于stack exchange,提问作者Janne Paalijarvi
相关产品推荐
相关产品推荐

