请教一个 nginx rewrite 指令匹配到的部分消失的问题

gwy15:我想实现一个 “根据不同的 header 中的 Accept-Language 返回不同的文件” 功能,我写的配置文件如下:

map $http_accept_language $locale {
    default         "en-US";
    ~*en            "en-US";
    ~*zh            "zh-CN";
}

server {
    listen 80;
    server_name _;

    location / {
        rewrite_log on;
        rewrite ^/(.*)$ /prerendered/$locale/$1;
    }

    location /prerendered/en-US {
        root /usr/share/nginx/html;
        # try_files $uri $uri/ $uri.html /prerendered/en-US/index.html =404;
    }

    location /prerendered/zh-CN {
        root /usr/share/nginx/html;
        # try_files $uri $uri/ $uri.html /prerendered/zh-CN/index.html =404;
    }
}

大体思路就是利用 map 定义一个 $locale 变量,然后 rewrite 到对应目录。

文件结构:

/usr/share/nginx/html/prerendered
├── en-US                                content:
│   ├── a.html                           a en-US
│   └── index.html                       index en-US
└── zh-CN
    ├── a.html                           a zh-CN
    └── index.html                       index zh-CN

curl 命令和结果:

$ curl http://127.0.0.1/a.html
a en-US
$ curl http://127.0.0.1/a.html -H 'Accept-Language: en'
index en-US
$ curl http://127.0.0.1/a.html -H 'Accept-Language:zh'
index zh-CN

从第二个命令开始,路径就被错误地重定向到了 /prerendered/en-US/,后面的 a.html 消失了。

nginx 对第二个命令的日志:

2020/09/09 09:45:16 [notice] 29#29: *4 "^/(.*)$" matches "/a.html", client: 172.17.0.1, server: _, request: "GET /a.html HTTP/1.1", host: "127.0.0.1"
2020/09/09 09:45:16 [notice] 29#29: *4 rewritten data: "/prerendered/en-US/", args: "", client: 172.17.0.1, server: _, request: "GET /a.html HTTP/1.1", host: "127.0.0.1"

可以看到,这个 rewrite 规则是命中了的,但是替换的时候后面的 $1 却没有替换上;而且只有 Accept-Language 包含 zh/en 才会出现,如果是 空 或者es(默认 map 到 en ),a.html 还是正常替换的。

求助各位这是哪里出现的问题?

不是说 nginx 创始人被俄罗斯警方抓了吗? 也没看到保释或者释放的消息,为啥他还在提交代码呢?

xiaoyanbot:https://github.com/nginx/unit 如题zy8848:水深火热警告

Nginx连接限制 - nginx

在3个具有TCP连接的php5-fpm服务器之前,我们有2个nginx服务器以1000reqs /秒的速度完美运行。我们认为一台nginx服务器就足够了,并将所有流量重定向到该服务器。但是,服务器的服务速度不能超过750reqs / sec。它具有千兆以太网,总流量不超过100mbits(Debian 6.0)我们找不到任何原因,经过谷歌搜索发现它可能与TC…

mod_rewrite:控制器的子域 - php

所以我有mydomain.tld,www.mydomain.tld和res.mydomain.tld都指向同一目录:/var/www/mydomain。在该目录中,有我的codeigniter应用程序。因此,我想做的是将通过res.mydomain.tld发出的所有请求转发到称为resources的特定控制器。我有的:RewriteCond %{HTTP_H…

开发了一个自动识别 HTML 列表的算法,感觉离智能爬虫又近了一步

tikazyq:话不多说,下面给几个主流网站列表页的识别效果。 可以看到,列表基本都识别出来了,一些列表子项( List Item )的字段也标注出来了。这个算法还支持分页的识别。如果进一步优化,甚至可以做到网络爬虫中的自动驾驶,输入一个坐标(网站 URL )就可以自动抓数据,不需要写 XPath 各种抓取配置规则。做到这一步,说明离智能爬虫就不远啦。 算法…

检查HTML表单复选框等是否已设置为POST的正确和最安全的方法是什么? - html

自从早期以来,这使我感到困惑。也许这只是在我脑海中,但在我看来,这似乎随着时间的推移而变化,在不同的浏览器之间,甚至可能取决于本地语言/地区。基本上,每当我需要检查是否已设置“ radio”或“ checkbox”类型的HTML输入时,我总是这样做:if (isset($_POST['the_name']) && trim…