Na verdade, estou usando uma RewriteMap
diretiva 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.txt
arquivo 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?
Você pode usar um segundo mapa de reescrita, a função interna 'escape' transforma os espaços em %20:
Então, em seu próprio db de mapa de reescrita, você pode ter:
Isso deve corresponder.
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:
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.
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:
E então use o seguinte em seu mapa de reescrita:
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: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...
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.