From c5d6635f01461b84cfe1e9e5c7eaae4b3502818a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Mon, 30 Mar 2026 08:19:15 +0300 Subject: [PATCH] feat: implement dynamic Nginx project configuration and IPC service management for PHP environments --- config/nginx_project.conf.template | 28 +++++++++++++++++----------- src/main/ipc/index.ts | 14 ++++++++------ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/config/nginx_project.conf.template b/config/nginx_project.conf.template index cba91ef..1311849 100644 --- a/config/nginx_project.conf.template +++ b/config/nginx_project.conf.template @@ -1,25 +1,31 @@ location ^~ /{{HOST}}/ { - alias "{{PATH}}/"; + alias "{{PATH}}"; index index.php index.html; autoindex on; - # Try the literal URI, then directory (checks for index), then fallback to root index.php - try_files $uri $uri/ /{{HOST}}/index.php?$query_string; + # Use a named location for reliable alias fallback + try_files $uri $uri/ @{{HOST}}; # PHP handling nested INSIDE the alias location to maintain context location ~ \.php$ { fastcgi_pass 127.0.0.1:{{PHP_PORT}}; fastcgi_index index.php; - # Split path info to handle subdirectories correctly - fastcgi_split_path_info ^/{{HOST}}(.+\.php)(.*)$; - include "{{CONF_DIR}}/fastcgi_params"; - # Bulletproof SCRIPT_FILENAME: combine base path with relative script name from split_path_info - # On Windows + Alias, $request_filename can be flaky during try_files redirects - fastcgi_param SCRIPT_FILENAME "{{PATH}}$fastcgi_script_name"; - fastcgi_param DOCUMENT_ROOT "{{PATH}}"; - fastcgi_param PATH_INFO $fastcgi_path_info; + # Normal files matched correctly by URI don't suffer the try_files bug + fastcgi_param SCRIPT_FILENAME $request_filename; } } + +# The named location handles requests that don't match physical files +location @{{HOST}} { + # Directly execute PHP without URI mutation to preserve framework routing paths + fastcgi_pass 127.0.0.1:{{PHP_PORT}}; + include "{{CONF_DIR}}/fastcgi_params"; + + # Hardcode the essential execution parameters + fastcgi_param SCRIPT_FILENAME "{{PATH}}index.php"; + fastcgi_param SCRIPT_NAME "/{{HOST}}/index.php"; + fastcgi_param DOCUMENT_ROOT "{{PATH}}"; +} diff --git a/src/main/ipc/index.ts b/src/main/ipc/index.ts index 9a756fd..9d99df1 100644 --- a/src/main/ipc/index.ts +++ b/src/main/ipc/index.ts @@ -61,21 +61,23 @@ async function rebuildNginxConfig(forceProjects: boolean = false): Promise<{ bin // If file exists, check if it was manually edited if (!shouldGenerate && fs.existsSync(projectConfPath)) { const currentContent = fs.readFileSync(projectConfPath, 'utf8') - if (currentContent.includes('# MANUAL_EDIT')) { - shouldGenerate = false // Never overwrite manual edits during auto-rebuild - } else if (forceProjects) { + if (!currentContent.includes('# MANUAL_EDIT')) { + // Overwrite old, broken configs that don't have the marker shouldGenerate = true } } if (shouldGenerate) { const phpPort = portMappingService.getPhpPort(p.phpVersion) - const normalizedPath = p.path.replace(/\\/g, '/') // Ensure path ends with a slash for alias compatibility - const pathWithSlash = normalizedPath.endsWith('/') ? normalizedPath : `${normalizedPath}/` + let normalizedPath = p.path.replace(/\\/g, '/') + if (!normalizedPath.endsWith('/')) { + normalizedPath += '/' + } + await configService.generateConfig('nginx_project.conf.template', `projects/${p.host}.conf`, { HOST: p.host, - PATH: pathWithSlash, + PATH: normalizedPath, PHP_PORT: phpPort.toString(), CONF_DIR: confDir.replace(/\\/g, '/') })