AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 806103
Accepted
COil
COil
Asked: 2016-09-30 05:26:43 +0800 CST2016-09-30 05:26:43 +0800 CST 2016-09-30 05:26:43 +0800 CST

Apache RewriteMap com URLs contendo espaço não funciona

  • 772

Na verdade, estou usando uma RewriteMapdiretiva dentro do meu vhost para redirecionar uma lista de 800 URLs. Funciona bem tranquilo:

RewriteEngine On
RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

Eu uso um redirect.txtarquivo contendo o mapeamento. Em seguida, ele é convertido em um arquivo db:

httxt2dbm -f db -i /data/apps/project/current/configuration/etc/httpd/conf/redirects.txt -o /data/apps/project/current/configuration/etc/httpd/conf/redirects.db

Por exemplo, para este tipo de URL, está OK:

/associations/old_index.php /

Mas quando o URL contém espaços, não funciona: (suponho que será o mesmo com outros caracteres especiais)

/Universités%20direct   /

Como lidar com este caso?

virtualhost redirect mod-rewrite apache2
  • 3 3 respostas
  • 4006 Views

3 respostas

  • Voted
  1. Chris Lawton
    2018-01-05T03:08:57+08:002018-01-05T03:08:57+08:00

    Você pode usar um segundo mapa de reescrita, a função interna 'escape' transforma os espaços em %20:

    RewriteMap ec int:escape
    
    RewriteMap redirects dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
    
    RewriteCond ${redirects:${ec:$1}} !=""
    
    RewriteRule ^(.*)$ ${redirects:${ec:$1}} [redirect=permanent,last]
    

    Então, em seu próprio db de mapa de reescrita, você pode ter:

    /Universités-direct%20/
    

    Isso deve corresponder.

    • 5
  2. Unbeliever
    2016-10-01T03:30:33+08:002016-10-01T03:30:33+08:00

    Você pode resolver isso extraindo o URI codificado da variável %{THE_REQUEST} e usando-o para fazer a pesquisa. Você precisa colocar os URIs codificados no mapa, é claro. Algo como o seguinte:

    Reescrever Motor Ligado
    RewriteMap redireciona dbm=db:/data/apps/project/current/configuration/etc/httpd/conf/redirects.db
    RewriteCond %{THE_REQUEST} "\w+ ([^ ]+)"
    RewriteRule ^ - [E=MYVAR:%1]
    
    RewriteCond ${redirects:%{ENV:MYVAR}} !=""
    RewriteRule ^ ${redirects:%{ENV:MYVAR}} [redirect=permanent,last] [B]
    

    Eu só testei com um mapa baseado em texto em vez do DB. Isso provavelmente precisará de modificação se você tiver que lidar com URLs com strings de consulta.

    • 3
  3. Best Answer
    MrWhite
    2016-09-30T13:51:31+08:002016-09-30T13:51:31+08:00

    Uma solução alternativa pode ser reescrever internamente as URLs que contêm um espaço para um hífen (substitua o espaço por um hífen) e incluir a URL hifenizada em seu mapa de reescrita.

    Se você tiver apenas alguns URLs que contenham um único espaço dentro do URL, poderá usar algo como a seguinte diretiva antes de suas diretivas existentes:

    RewriteRule ^(.+)\s(.+)$ $1-$2
    

    E então use o seguinte em seu mapa de reescrita:

    /Universités-direct /
    

    ATUALIZAÇÃO: Se você tiver URLs que contenham dois espaços (por exemplo. /the force awakens) e alguns com um espaço, poderá adicionar uma regra adicional:

    RewriteRule ^(.+)\s(.+)\s(.+)$ $1-$2
    RewriteRule ^(.+)\s(.+)$ $1-$2
    

    Essas regras pressupõem que você não tenha URLs que terminem com um espaço. E nenhuma URL tem mais de um espaço contíguo.

    Se houver três espaços, adicione outra regra antes da anterior...

    RewriteRule ^(.+)\s(.+)\s(.+)\s(.+)$ $1-$2
    

    Eu tenderia a fazer isso com várias regras (simples), em vez de um genérico "converter tudo em uma única regra", a menos que você precise especificamente disso. Uma regra genérica será executada recursivamente, reduzindo vários espaços a um único caractere. Você provavelmente também precisará de sinalizadores adicionais (por exemplo. DPI) para evitar um bug de reescrita conhecido no Apache.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve