如何从 nginx 中的 url 字符串中删除连字符和下划线?

如何从 nginx 中的 url 字符串中删除连字符和下划线?

我一直在尝试从发送到我的 nginx 服务器的 URL 请求中删除任何/所有连字符 - 和下划线 _。

因此要明确的是,当有人输入如下 URL 时:

https://www.example.com/my-name_is-tom

...我需要 nginx 重写 URL,如下所示:

https://www.example.com/mynameistom

我正在使用以下配置:

server {
   listen 80;
   return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name top.example.com;

    ssl_certificate     /etc/ssl/top.example.com.crt;
    ssl_certificate_key /etc/ssl/top.example.com.key;

    # set the root
    root /srv/top.exemple.com;
    index index.html;


    location ~ ^/([a-zA-Z0-9=\?\_\-]+)$ {
        rewrite ^(/.*)-(.*)$ $1$2 last;
        rewrite ^(/.*)_(.*)$ $1$2 last;
        rewrite ^/(.*)$ / break;
    }

    location / {
        ssi on;
    }
    # BOSH
    location /http-bind {
        proxy_pass      http://localhost:0000/http-bind;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
    }
}

...然而,我没有看到任何重写发生。

  1. 也许我错误地设计了位置重写功能?

  2. 也许我需要以某种方式重写 X-Forward-For $remote_addr; ???

任何见解/建议都将非常感激——我只是不太了解 nginx 和 regexp。

提前感谢大家的时间和关注。

编辑/PS。 看来我需要某种规则来从 $request_uri 中删除非字母数字。因此:

example.com/my-name-is-tom.html

将在浏览器 URL 字段中直观地重写为:

example.com/mynameistomhtml

我知道这听起来很奇怪,但是......这就是必须要发生的事情。

如有任何进一步的见解,我们将不胜感激。谢谢!

答案1

要更改客户端浏览器地址栏中显示的 URL,您需要一个外部重定向

rewrite ^(.*)[-_](.*)$ $1$2 permanent;

例如,如果您需要限制重写的范围,/http-bind/那么不是重写后,你可以使正则表达式更加具体:

rewrite ^(/[^/]*)[-_]([^/]*)$ $1$2 permanent;

解释:捕获并匹配前导斜杠,后跟零个或多个非斜杠字符。匹配连字符或下划线。捕获并匹配零个或多个非斜杠字符。

两次重写都会重复重定向 HTTP 301 响应,直到所有内容[-_]都被删除。

将其放置rewrite在第一个location块之前。

如果将 放在块rewritelocation,请确保位置与重写预期要重写的 URI 范围相匹配。但是,重写规则已经非常具体,因此位置块的存在是相当多余的。

这个文件了解更多信息。

相关内容