Como apagar hífen e sublinhado da string url em nginx?

1

Eu tenho tentado excluir todos os hífens - e sublinhados _ de uma solicitação de URL recebida para o meu servidor nginx.

Então, para ser claro, quando alguém inserir um URL da seguinte forma:

link

... Preciso que o nginx reescreva o URL da seguinte forma:

link

Estou trabalhando com a seguinte configuração:

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

... no entanto, não vejo reescrita acontecendo.

  1. Talvez eu tenha criado esse local para reescrever algo errado?

  2. Talvez eu precise reescrever de alguma forma o X-Forward-For $ remote_addr; ???

Qualquer percepção / sugestão seria MUITO apreciada - eu não sei muito sobre nginx e regexp.

Agradeço a todos antecipadamente por qualquer tempo e atenção.

EDIT / PS. Parece que preciso de algum tipo de regra que remova não-alfanuméricos de $ request_uri. Então isso:

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

seria reescrito visualmente no campo URL do navegador para:

example.com/mynameistomhtml

Eu percebo o quão totalmente estranho isso soa, mas ... é isso que precisa acontecer.

Qualquer outra visão seria tremendamente apreciada. TY!

    
por nsdb 31.01.2016 / 09:49

1 resposta

0

Para alterar o URL exibido no campo de endereço do navegador do cliente, você precisa de um redirecionamento externo :

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

Se você precisar restringir o escopo da regravação, por exemplo, para que /http-bind/ seja não reescrito, você pode tornar a regex mais específica:

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

Explicação: captura e combina barra anterior seguida de zero ou mais caracteres não-barra. Corresponder hífen ou sublinhado. Capture e combine zero ou mais caracteres não slash.

As duas reescritas serão redirecionadas com uma resposta HTTP 301, repetidamente, até que todos os [-_] sejam removidos.

Coloque o rewrite antes do primeiro bloco location .

Se você colocar o rewrite dentro de um bloco location , assegure-se de que o local corresponda ao intervalo de URIs que a reescrita deve reescrever. No entanto, a regra de reescrita já é bastante específica, portanto, a presença de um bloco de localização é bastante redundante.

Veja este documento para saber mais.

    
por 01.02.2016 / 11:35