单域子目录多语言配置后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; } }
验证步骤
- 保存修改后的Nginx配置
- 测试配置合法性:
sudo nginx -t - 重启Nginx服务:
sudo systemctl restart nginx - 清除Magento缓存:
php bin/magento cache:flush
这样就能解决404问题,同时正确加载对应域名和语言目录的店铺视图了。
内容的提问来源于stack exchange,提问作者N00bMagg
相关产品推荐
相关产品推荐

