Как удалить дефис и подчеркивание из строки 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;
    }
}

... однако я не вижу переписывания.

  1. Может быть, я неправильно переписал это место?

  2. Может быть, мне нужно как-то переписать 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, которые, как ожидается, переписать переписать. Однако правило перезаписи уже довольно специфично, поэтому наличие блока местоположения довольно избыточно.

Смотрите этот документ для более.

Другие вопросы по тегам