我们有一个网站和一个带有阿拉伯语和英语地址的网站。我们需要将一些带有 404 状态代码的 URL 重定向到 NGINX Web 服务中的 410 状态代码(由于 SEO)。 我们配置了 NGINX Web 服务并添加了阿拉伯语和英语 URL,英语 URL 成功重定向到状态代码 410(NGINX 错误页面),但阿拉伯语 URL 的重定向不起作用,并给用户带来了 404 错误页面的最终展示。我的问题是为什么重定向阿拉伯语 URL 不起作用,因为两种类型的 URL(阿拉伯语和英语)的配置完全相同。
示例网址: https://example.com/test 和 https://example.com/
NGINX 配置文件:
map $request_uri $is_retired_url {
including /etc/nginx/conf.d/redirects/410.redirects;
}
server {
if ($is_retired_url) {
return 410;
}
文件410.redirects的内容:
/test 1;
/تست 1;
另外,我用 https://www.urlencoder.org/ 编码了阿拉伯语 URL,但它不起作用。
NGINX配置参考: https://jonathanmh.com/nginx-410-maps-and-custom-error-page/
文件
410.redirects
包含双向文本,这最初使问题难以理解,但这不是根本问题。
变量
$request_uri
包含Nginx从浏览器接收到的原始请求。虽然浏览器会显示包含阿拉伯文本的 URL,但实际传输的是包含 url 编码字符的 URL。例如,您问题中的阿拉伯文本在 $request_uri
中显示为:
/%D8%AA%D8%B3%D8%AA
Nginx 有另一个名为
$uri
的变量,它最初设置为 $request_uri
的规范化版本。规范化过程的一部分是将 url 编码的字符解码回其原始形式。
如果您将
410.redirects
从 map
更改为 $request_uri
,您现有的 $uri
文件将起作用。
例如:
map $uri $is_retired_url {
including /etc/nginx/conf.d/redirects/410.redirects;
}