You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改说明

  1. 传递完整请求路径:通过fastcgi_param REQUEST_URI $request_uri确保Symfony能获取到完整的URL路径(如/example1),从而正确匹配对应的路由。
  2. 统一前端控制器:定义@symfony_front_controller命名location,避免重复代码,同时通过rewrite将/example1/xxx转换为Symfony可识别的/index.php/xxx格式。
  3. 移除冲突规则:删除了排除/example1的regex location,因为^~前缀的location优先级更高,会优先匹配/example1和/example2请求,无需额外排除。
  4. 合并访问控制:将重复的访问控制规则提取到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:10:18