我一直在尝试从发送到我的 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;
}
}
...然而,我没有看到任何重写发生。
也许我错误地设计了位置重写功能?
也许我需要以某种方式重写 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
块之前。
如果将 放在块rewrite
内location
,请确保位置与重写预期要重写的 URI 范围相匹配。但是,重写规则已经非常具体,因此位置块的存在是相当多余的。
看这个文件了解更多信息。