NGINX中阿拉伯语URL无法跳转至410状态页问题咨询
问题:阿拉伯语URL在NGINX中无法返回410状态码
我们运营支持阿拉伯语与英语地址的网站,为优化SEO,需将部分原本返回404的URL配置为返回410状态码。配置完成后,英语URL可正常返回410错误页,但阿拉伯语URL仍返回404,两类URL的配置逻辑完全一致。我们尝试过对阿拉伯语URL进行URL编码,但问题依旧,现寻求该问题的原因及解决办法。
示例URL
- 英语URL:
https://example.com/test - 阿拉伯语URL:
https://example.com/تست(对应URL编码:https://example.com/%D8%AA%D8%B3%D8%AA)
当前NGINX配置
主配置文件片段
map $request_uri $is_retired_url { include /etc/nginx/conf.d/redirects/410.redirects; } server { if ($is_retired_url) { return 410; } }
410.redirects文件内容
/test 1; /تست 1;
原因分析
$request_uri的特性:NGINX的$request_uri变量存储的是URL编码后的原始请求路径,而配置文件中使用了未编码的阿拉伯语字符/تست,两者无法匹配。- 配置文件编码问题:即使手动编码后尝试,若410.redirects文件未以UTF-8编码保存,NGINX读取时会将阿拉伯语字符解析为乱码,导致匹配失败。
解决办法
提供两种可行方案,可根据实际场景选择:
方案一:使用URL编码后的路径匹配
直接在410.redirects中写入编码后的阿拉伯语URL路径,确保与$request_uri的存储格式一致:
/test 1; /%D8%AA%D8%B3%D8%AA 1;
注意:需验证编码的准确性,确保编码结果与请求中的路径完全对应。
方案二:改用$uri变量并确保配置文件编码为UTF-8
- 将410.redirects文件以UTF-8无BOM格式保存,避免字符解析乱码。
- 修改NGINX主配置,使用
$uri变量进行匹配——$uri存储的是解码后的请求路径,可直接匹配未编码的阿拉伯语字符:
map $uri $is_retired_url { include /etc/nginx/conf.d/redirects/410.redirects; } server { if ($is_retired_url) { return 410; } }
该方案更直观,适合多语言URL的管理场景。
内容的提问来源于stack exchange,提问作者HamidReza Khoubbakht
相关产品推荐
相关产品推荐

