Nginx子目录独立根目录配置问题:@ono_php未调用对应PHP location块
Nginx子目录独立PHP环境配置解决方案
问题核心是全局命名location(@ono_php)会脱离/sub2/的上下文,匹配根目录的PHP处理规则,导致路由错误。以下是直接有效的解决配置和原理说明:
正确配置示例
server { listen 443 ssl; server_name example.com; root /var/www/site; # 根站点PHP处理规则 location ~ \.php$ { fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # /sub2/独立配置块 location /sub2/ { alias /var/www/sub2/; index index.php index.html; # 优先匹配静态文件,不存在则路由到/sub2/index.php try_files $uri $uri/ /sub2/index.php$is_args$args; # /sub2/专属PHP处理规则(嵌套location仅作用于当前上下文) location ~ \.php$ { fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_index index.php; # 因使用alias,必须用$request_filename获取真实文件路径 fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } } }
关键要点说明
- 避免全局命名location:@ono_php是全局级别的规则,调用时会跳出/sub2/的上下文,导致匹配根目录的PHP块。改用
try_files直接在/sub2/内部处理路由,无需依赖全局命名location。 - 嵌套location的作用域:嵌套在
location /sub2/内的~ \.php$块仅处理/sub2/路径下的PHP请求,不会和根站点的PHP规则冲突。 - alias路径修正:使用
alias时,不能用$document_root$fastcgi_script_name拼接文件路径,必须用$request_filename才能正确指向/var/www/sub2/下的文件(Nginx会自动根据alias规则解析真实路径)。
验证方法
访问https://example.com/sub2/contact时,Nginx会先检查是否存在/var/www/sub2/contact静态文件,不存在则重写到/var/www/sub2/index.php,由/sub2/专属的PHP块处理,不会再调用根目录的PHP规则。
内容的提问来源于stack exchange,提问作者Kohjah Breese
相关产品推荐
相关产品推荐

