为Nginx子目录网站配置正确的根路径与重定向规则
解决Nginx下主站与/blog子站的重写规则问题
嘿,我来帮你搞定这个Nginx重写的难题!你的核心问题是原规则没有区分主站和/blog子目录的动态请求转发逻辑,导致博客内页的请求被错误地送到了主站的index.php,自然返回404错误。咱们用更清晰的location块来替代原来的多if配置(Nginx里if要尽量少用,容易触发意外行为),具体配置如下:
完整的重写规则配置
# 首先排除Plesk专属的静态统计路径,直接返回静态内容 location ~ ^/(plesk-stat|webstat|webstat-ssl|ftpstat|anon_ftpstat|awstats-icon|internal-nginx-static-location) { try_files $uri $uri/ =404; } # 处理主站的动态请求(非/blog路径) location / { # 先检查请求的文件/目录是否存在,不存在则转发到主站的index.php try_files $uri $uri/ /index.php?$args; } # 专门处理/blog子目录的动态请求 location /blog { # 先检查/blog下的文件/目录是否存在,不存在则转发到博客的index.php try_files $uri $uri/ /blog/index.php?$args; } # 通用PHP处理规则(确保Plesk环境下PHP-FPM配置正确) location ~ \.php$ { # 替换成你服务器上实际的PHP-FPM套接字路径,比如php7.4或php8.1 fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
配置说明
- Plesk路径排除:专门匹配Plesk的统计相关路径,直接返回静态内容,避免被动态规则干扰。
- 主站规则:针对根路径的请求,优先访问静态资源,静态资源不存在时,将请求转发到根目录的
index.php,带上原请求参数。 - 博客子站规则:针对
/blog开头的请求,优先检查/blog目录下的静态资源,不存在时转发到/blog/index.php,这样博客的内页请求会被正确交给博客的入口文件处理。 - PHP处理:确保所有PHP请求都能正确转发到PHP-FPM,这部分Plesk可能会自动生成,但如果有问题可以手动调整套接字路径。
为什么原规则失效?
原来的多if规则是全局匹配所有路径,当你访问/blog/post-1时,规则会把请求重写到/index.php?blog/post-1——主站的index.php根本不认识这个路径,所以返回404。而新配置通过location /blog单独处理,会把请求转发到/blog/index.php?post-1,博客的程序就能正确解析这个请求了。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

