Nginx配置问题:访问/php子目录跳转至CodeIgniter主站
Nginx配置两个PHP站点的重定向问题解决
问题场景
需要部署两个PHP站点:
- CodeIgniter框架应用,实际路径为
/var/www/html/code - 简单PHP脚本应用,实际路径为
/var/www/html/php/app,通过https://example.com/php/访问
当前Nginx配置存在问题:访问https://example.com/php/some_sub_directory时,会被重定向到CodeIgniter主应用的根路径https://example.com/。
当前配置如下:
server { listen 443 ssl; listen [::]:443 ssl; client_max_body_size 20M; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; root /var/www/html/code; server_name example.com; ssl_certificate /etc/nginx/ssl/cert.crt; ssl_certificate_key /etc/nginx/ssl/cert.key; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; } #codeigniter location / { try_files $uri $uri/ /index.php?$uri&$args; } #simple php application location ^~ /php { index index.php; alias /var/www/html/php/app; try_files $uri $uri/ /index.php?$query_string ; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $request_filename; } } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_read_timeout 300; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffer_size 128k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } }
问题原因
location ^~ /php中的try_files最后一项/index.php?$query_string是绝对路径,会匹配到根目录(/var/www/html/code)下的index.php,直接跳转到CodeIgniter主应用入口。- 原配置存在语法错误(
server块内多了一个闭合大括号),可能导致Nginx解析逻辑异常。 - 嵌套的PHP location未适配
alias路径的脚本解析逻辑。
修复后的配置
server { listen 443 ssl; listen [::]:443 ssl; client_max_body_size 20M; index index.php index.html index.htm index.nginx-debian.html; root /var/www/html/code; server_name example.com; ssl_certificate /etc/nginx/ssl/cert.crt; ssl_certificate_key /etc/nginx/ssl/cert.key; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # CodeIgniter 主应用 location / { try_files $uri $uri/ /index.php?$uri&$args; } # 简单PHP应用(/php路径映射到/var/www/html/php/app) location ^~ /php { index index.php; alias /var/www/html/php/app; # 修正try_files路径,指向当前location下的index.php try_files $uri $uri/ /php/index.php?$query_string; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; include fastcgi_params; # 适配alias路径,确保脚本路径正确 fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_index index.php; } } # 全局PHP处理(仅处理主应用的PHP文件) location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_read_timeout 300; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_buffer_size 128k; fastcgi_buffers 256 4k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } }
关键修改说明
- 修正
try_files跳转路径:将/index.php?$query_string改为/php/index.php?$query_string,确保不存在的目录/文件请求转发到PHP子应用的入口,而非主应用根目录。 - 修复语法错误:删除
server块内多余的闭合大括号,保证配置解析正常。 - 完善嵌套PHP配置:在
/php的PHP location中添加fastcgi_index index.php,确保目录访问能正确解析到入口脚本。
验证步骤
- 检查配置语法:
nginx -t - 重新加载Nginx:
systemctl reload nginx - 访问
https://example.com/php/some_sub_directory,验证是否由PHP子应用处理,而非跳转至主应用根目录。
内容的提问来源于stack exchange,提问作者Rafelo
相关产品推荐
相关产品推荐

