Apache RewriteMap com URLs que contêm espaço não funciona

3

Na verdade, estou usando uma diretiva RewriteMap 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 arquivo redirect.txt contendo o mapeamento. Então é 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á tudo bem:

/associations/old_index.php /

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

/Universités%20direct   /

Como lidar com este caso?

    
por COil 29.09.2016 / 15:26

3 respostas

1

Uma solução alternativa pode ser internamente reescrever URLs que contenham um espaço em um hífen (substituir o espaço por um hífen) e incluir o URL com hífen em seu mapa de reconfiguração.

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

Em seguida, use o seguinte no seu mapa de reescrita:

/Universités-direct /

UPDATE: Se você tem URLs que contêm dois espaços (por exemplo, /the force awakens ) e outros com um espaço, adicione uma regra adicional:

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

Essas regras presumem que você não tem URLs que terminam com um espaço. E nenhum URL tem mais de um espaço contíguo.

Se três espaços adicionarem outra regra antes do 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ê especificamente precise disso. Uma regra genérica será executada recursivamente, reduzindo vários espaços para um único caractere. Você provavelmente também precisará de sinalizadores adicionais (por exemplo, DPI ) para evitar um bug de reconfiguração conhecido no Apache.

    
por 29.09.2016 / 23:51
3

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

RewriteEngine On
RewriteMap redirects 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á ser modificado se você tiver que lidar com URLs com strings de consulta.

    
por 30.09.2016 / 13:30
3

Você pode usar um segundo mapa de reescrita, a função interna 'escape' transforma 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]

Em seguida, em seu próprio mapa de reescrita db, você pode ter:

/Universités-direct%20/

Isso deve corresponder.

    
por 04.01.2018 / 12:08