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

我一直试图删除任何/所有的连字符 – 并强调_传入的URL请求到我的nginx服务器。

所以要清楚的是,当有人input一个URL如下:

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

…我需要nginx重写URL如下:

https://www.example.com/mynameistom

我正在使用以下configuration:

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; ???

任何见解/build议将非常感激 – 我只是不太了解nginx和正则expression式。

任何时间和关注提前谢谢大家。

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

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

将在浏览器URL字段中以可视方式重新写入:

example.com/mynameistomhtml

我意识到这听起来有多奇怪,但是…这就是需要发生的事情。

任何进一步的洞察力将非常感激。 TY!

要更改客户端浏览器地址字段中显示的URL,您需要外部redirect

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

如果您需要限制重写的范围,例如,使/http-bind/ 不被重写,则可以使正则expression式更具体:

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

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

这两个重写都会重复redirectHTTP 301响应,直到所有的[-_]被删除。

rewrite置于第一个location块之前。

如果将rewrite放置在location块中,请确保该位置与要重写的URI的范围相匹配。 但是,重写规则已经非常具体,所以位置块的存在是相当多的。

请参阅此文档了解更多