如何通过Nginx配置将子文件夹作为站点根目录提供服务?
Nginx主域名映射到folder2的可行配置
你之前配置不生效,核心原因是修改路径映射时没有同步处理PHP解析的路径参数,导致PHP-FPM收到错误的文件路径,返回404或源码下载结果。
直接替换/etc/nginx/sites-enabled/mydomain中的server块内容为以下配置即可,原有folder1的访问完全不受影响:
server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name mydomain.com; # 根路径映射到folder2目录 location / { alias /var/www/html/folder2/; # 路径末尾必须加斜杠,否则会出现路径拼接错误 # 普通PHP站点用下面这行try_files try_files $uri $uri/ =404; # 如果是单入口PHP应用(比如ThinkPHP、Laravel、WordPress),注释上面行,用下面这行 # try_files $uri $uri/ /index.php?$query_string; # 单独处理根路径下的PHP解析,修正路径传递问题 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $request_filename; } } # 保留folder1原有访问规则 location /folder1 { try_files $uri $uri/ =404; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } } # 保留原有.ht文件拒绝访问规则 location ~ /\.ht { deny all; } }
生效操作步骤
- 保存配置后先执行校验命令,避免配置错误导致Nginx服务中断:
sudo nginx -t - 终端输出
test is successful提示后,重载配置生效:sudo systemctl reload nginx - 测试时优先用
curl http://mydomain.com验证,避免浏览器缓存干扰结果
常见踩坑提醒
- 不要直接修改全局root为
/var/www/html/folder2,这会导致访问mydomain.com/folder1时实际查找/var/www/html/folder2/folder1路径,原有服务直接404 - 使用alias做路径映射时,不能依赖全局的PHP解析规则,必须在对应location块内单独配置PHP解析,同时修正
SCRIPT_FILENAME参数,否则PHP-FPM会收到错误的文件路径 - alias配置的目录路径末尾必须加
/,否则会出现/var/www/html/folder2index.php这类错误的路径拼接结果
内容的提问来源于stack exchange,提问作者Marry Jane
相关产品推荐
相关产品推荐

