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

Я понимаю, насколько полностью странно это звучит, но ... вот что должно произойти.

Любое дальнейшее понимание будет чрезвычайно признательно. ТЫ!

1
задан 1 February 2016 в 05:59
1 ответ

Для изменения URL, отображаемого в адресном поле браузера клиента, необходим внешний редирект :

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

Если, например, необходимо ограничить область перезаписи, чтобы /http-bind/ был не переписан, можно сделать регенерацию более конкретной:

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

Пояснение: захват и совпадение ведущего косая черты, за которым следуют нулевые или более не косая черта. Подходит дефис или подчеркивание. Захват и совпадение нуля и более не косых символов.

Оба перезаписанных текста будут повторно перенаправляться с ответом HTTP 301 до тех пор, пока не будут удалены все символы [-_].

Поместите перезапись перед первым блоком местоположения .

Если вы поместили перезапись внутри блока местоположения , убедитесь, что местоположение соответствует диапазону URI, которые предполагается перезаписать при перезаписи. Однако правило перезаписи уже достаточно специфично, поэтому наличие блока местоположения является довольно избыточным.

См. настоящий документ для более подробной информации.

0
ответ дан 4 December 2019 в 06:40

Теги

Похожие вопросы