Nginx配置问题:WordPress主域名下Symfony路由无法正确匹配
问题分析与解决方案
问题根源
你的配置核心问题在于:使用alias映射Symfony的public目录时,没有将完整的请求路径(如/example1)传递给Symfony的前端控制器index.php,导致Symfony无法识别路由,只能返回首页。另外,配置中存在重复的location规则(比如排除/example1的regex location),可能干扰正常的请求匹配逻辑。
修正后的Nginx配置
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name domain.com; server_tokens off; root /var/www/html/wordpress; index index.php index.html index.htm; client_max_body_size 500M; charset utf-8; # 统一访问控制规则,减少冗余 satisfy any; allow 1.1.1.0/32; deny all; # WordPress主站点处理 location / { try_files $uri $uri/ /index.php?$query_string; } # Symfony /example1 路由转发 location ^~ /example1 { alias /var/www/html/symfony/current/public/; try_files $uri $uri/ @symfony_front_controller; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; # 关键:传递完整请求路径给Symfony include fastcgi_params; } } # Symfony /example2 路由转发 location ^~ /example2 { alias /var/www/html/symfony/current/public/; try_files $uri $uri/ @symfony_front_controller; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; # 关键:传递完整请求路径给Symfony include fastcgi_params; } } # Symfony前端控制器统一处理 location @symfony_front_controller { rewrite ^/example(1|2)/(.*)$ /index.php/$2 last; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/symfony/current/public/index.php; fastcgi_param REQUEST_URI $request_uri; include fastcgi_params; } # 静态资源与安全规则 location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location ~ /\.(?!well-known).* { deny all; } # PHP通用内部处理规则 location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; include fastcgi_params; internal; } access_log off; error_log /var/log/nginx/domain.com-error.log error; error_page 404 /index.php; }
关键修改说明
- 传递完整请求路径:通过
fastcgi_param REQUEST_URI $request_uri确保Symfony能获取到完整的URL路径(如/example1),从而正确匹配对应的路由。 - 统一前端控制器:定义
@symfony_front_controller命名location,避免重复代码,同时通过rewrite将/example1/xxx转换为Symfony可识别的/index.php/xxx格式。 - 移除冲突规则:删除了排除/example1的regex location,因为
^~前缀的location优先级更高,会优先匹配/example1和/example2请求,无需额外排除。 - 合并访问控制:将重复的访问控制规则提取到server块下,减少配置冗余。
额外优化建议
如果/example1和/example2的逻辑完全一致,可以合并为一个location规则,简化配置:
location ^~ /example(1|2) { alias /var/www/html/symfony/current/public/; try_files $uri $uri/ @symfony_front_controller; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; include fastcgi_params; } }
内容的提问来源于stack exchange,提问作者Bast
相关产品推荐
相关产品推荐

