Как удалить дефис и подчеркивание из строки URL в nginx?
Я пытался удалить ЛЮБЫЕ / ВСЕ дефисы - и подчеркивал _ из входящего запроса URL на мой сервер nginx.
Чтобы было понятно, когда кто-то вводит 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.
Заранее всем спасибо за любое время и внимание.
EDIT / PS. Кажется, мне нужно какое-то правило, которое удаляет не $ алфавитно-цифровые символы из $ request_uri. Итак, это:
example.com/my-name-is-tom.html
будет визуально переписан в поле URL браузера, чтобы:
example.com/mynameistomhtml
Я понимаю, как странно это звучит, но... это то, что должно произойти.
Любое дальнейшее понимание будет высоко ценится. TY!
1 ответ
Чтобы изменить URL-адрес, отображаемый в поле адреса браузера клиента, вам необходимо внешнее перенаправление:
rewrite ^(.*)[-_](.*)$ $1$2 permanent;
Если вам нужно ограничить область переписывания, например, чтобы /http-bind/
не переписывается, вы можете сделать регулярное выражение более конкретным:
rewrite ^(/[^/]*)[-_]([^/]*)$ $1$2 permanent;
Объяснение: захватить и сопоставить начальную косую черту, за которой следует ноль или более символов без косой черты. Совпадение с дефисом или подчеркиванием. Захват и совпадение ноль или более символов без косой черты.
Оба перезаписи будут перенаправляться с ответом HTTP 301, несколько раз, пока все [-_]
удалены.
Поместите rewrite
до первого location
блок.
Если вы разместите rewrite
внутри location
блок, убедитесь, что местоположение соответствует диапазону URI, которые, как ожидается, переписать переписать. Однако правило перезаписи уже довольно специфично, поэтому наличие блока местоположения довольно избыточно.
Смотрите этот документ для более.