Apache case Mod_rewrite insensível para regra única

1

Estou usando o mod_rewrite para URLs amigáveis do mecanismo de pesquisa. Eu tenho essa linha que funciona muito bem:

RewriteRule ^Pay ./pay.php [L] #Pay

mas gostaria de também ter uma correspondência se um visitante digitar http://example.com/pay (observe as letras minúsculas). Eu tentei usar NC , mas recebo um erro 500. Eu tentei fazer duas regras separadas, uma maiúscula e outra minúscula, mas novamente 500 erro.

Isso pode ser feito em uma linha usando uma expressão regular? Algo como:

RewriteRule ^([P-p])ay ./pay.php [L] #Pay

Se sim, qual é o caminho correto? Se não como eu poderia conseguir isso sem usar mod_spelling?

    
por Sabyre 01.09.2017 / 16:44

2 respostas

0
RewriteRule ^Pay ./pay.php [L] #Pay

Você recebe um erro 500 devido a um loop de reescrita sem fim. Se você simplesmente fizer a maiúsculas e minúsculas acima, então a URL reescrita, por exemplo. /pay.php corresponde ao padrão insensível a maiúsculas ^Pay etc. etc.

Nesse caso, você pode simplesmente tornar seu padrão mais restritivo e corresponder apenas a "pagamento", não a qualquer caminho de URL que simplesmente inicie "pagamento". Por exemplo:

# Pay
RewriteRule ^pay$ pay.php [NC,L]

Eu também removi o prefixo ./ no susbstitution , isso não é necessário. Além disso, o Apache não suporta comentários de fim de linha.

Esteja ciente, no entanto, que ao fazer essa reescrita não diferencia maiúsculas de minúsculas, isso potencialmente resulta em conteúdo duplicado .

    
por 01.09.2017 / 17:17
0

Não conheço uma regra de reescrita simples que não diferencia maiúsculas de minúsculas, mas sua tentativa de corresponder a P ou p está muito próxima de ser corrigida. Basta omitir o traço e os suportes, funciona. Isto é o que eu testei para você (o mais simples possível):

RewriteRule ^/[Pp]ay /pay.php

Caracteres entre colchetes são apenas alternativas para 1 caractere, então

RewriteRule ^[Pp][Aa][yY] /pay.php

corresponderia a qualquer combinação de letras minúsculas e maiúsculas. Não tenho certeza, no entanto, por que sua versão não funcionou, porque significa "combinar qualquer caractere entre P e p", que deve ser P, Q, R, ... Z, alguma-punktuação, a, b , c ... p. Eu não testei sua versão.

Os colchetes () não devem causar nenhum dano, apenas significam "extraia o que você achar lá e torne-o acessível como '$ 1' na string de substituição".

Sugestão: tente com arquivos estáticos. Crie test.html com algum conteúdo simulado ("this is test.html", por exemplo), tente acessá-lo com seu navegador através do servidor da web que você está testando. Em seguida, adicione uma regra

rewriterule ^/best.html$ /test.html

e acessa best.html - você deve ver test.html. Continue mudando pequenos pedaços da sua regra de reescrita até encontrar a peça que deu errado.

    
por 01.09.2017 / 17:35