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

单域子目录多语言配置后Nginx返回404错误,求解决方法

解决单域多语言Magento店铺的Nginx 404问题

你的配置里有几个关键遗漏和逻辑问题,导致访问站点时出现404。我来一步步帮你修正:

1. 修正map规则,区分域名与语言目录

原来的map只依据$request_uri匹配,完全没区分abc.com和abc.hk,这会导致abc.hk/zh错误匹配到my_zh而非hk_zh。我们需要结合$host和$request_uri做精准映射:

map "$host$request_uri" $MAGE_RUN_CODE {
    default my_en;
    # abc.com 域名下的语言映射
    ~^abc.com/en my_en;
    ~^abc.com/zh my_zh;
    ~^abc.com/ms my_ms;
    # abc.hk 域名下的语言映射
    ~^abc.hk/en hk_en;
    ~^abc.hk/zh hk_zh;
}

map "$host$request_uri" $MAGE_RUN_TYPE {
    default store;
    # 所有语言目录对应的类型统一为store
    ~^abc.com/(en|zh|ms) store;
    ~^abc.hk/(en|zh) store;
}

2. 添加abc.hk的server块

你现在只有abc.com的服务器配置,访问abc.hk时会走默认服务器(如果存在)或者直接返回404。必须添加对应的server块:

server {
    listen 80;
    server_name abc.hk;
    set $MAGE_ROOT /var/www/html;
    # 和abc.com保持一致,加载Magento默认Nginx配置
    include /var/www/html/nginx.conf.sample;
}

3. 重写请求URI,移除语言子目录前缀

当用户访问abc.com/zh/product时,Magento后端实际需要处理的是/product,而非/zh/product。所以要在两个server块中添加重写规则,剥离语言前缀后再传递给后端:

在每个server块的include /var/www/html/nginx.conf.sample;之前添加:

# 匹配语言子目录开头的请求,重写URI
rewrite ^/(en|zh|ms)(/.*)?$ $2 last;

(针对abc.hk的en/zh也适用这条规则,无需额外修改)

4. 确保FastCGI参数正确传递

Magento依赖MAGE_RUN_CODE和MAGE_RUN_TYPE加载对应店铺视图,所以要在server块中明确传递这两个变量给FastCGI。可以在include语句后添加:

location ~ \.php$ {
    fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
    fastcgi_param MAGE_RUN_TYPE $MAGE_RUN_TYPE;
}

注:如果你的nginx.conf.sample已经包含这些参数的占位,可跳过此步,确保变量能正常传递即可。

最终完整配置示例

map "$host$request_uri" $MAGE_RUN_CODE {
    default my_en;
    ~^abc.com/en my_en;
    ~^abc.com/zh my_zh;
    ~^abc.com/ms my_ms;
    ~^abc.hk/en hk_en;
    ~^abc.hk/zh hk_zh;
}

map "$host$request_uri" $MAGE_RUN_TYPE {
    default store;
    ~^abc.com/(en|zh|ms) store;
    ~^abc.hk/(en|zh) store;
}

upstream fastcgi_backend {
     server  unix:/run/php/php7.0-fpm.sock;
}

server {
     listen 80;
     server_name abc.com;
     set $MAGE_ROOT /var/www/html;

     # 重写语言子目录,移除前缀
     rewrite ^/(en|zh|ms)(/.*)?$ $2 last;

     include /var/www/html/nginx.conf.sample;

     # 传递Magento店铺变量给FastCGI
     location ~ \.php$ {
         fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
         fastcgi_param MAGE_RUN_TYPE $MAGE_RUN_TYPE;
     }
}

server {
     listen 80;
     server_name abc.hk;
     set $MAGE_ROOT /var/www/html;

     # 重写语言子目录,移除前缀
     rewrite ^/(en|zh)(/.*)?$ $2 last;

     include /var/www/html/nginx.conf.sample;

     # 传递Magento店铺变量给FastCGI
     location ~ \.php$ {
         fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
         fastcgi_param MAGE_RUN_TYPE $MAGE_RUN_TYPE;
     }
}

验证步骤

  1. 保存修改后的Nginx配置
  2. 测试配置合法性:sudo nginx -t
  3. 重启Nginx服务:sudo systemctl restart nginx
  4. 清除Magento缓存:php bin/magento cache:flush

这样就能解决404问题,同时正确加载对应域名和语言目录的店铺视图了。

内容的提问来源于stack exchange,提问作者N00bMagg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:18:21