Regra de reescrita não está funcionando totalmente em .htaccess [duplicado]

1

Ok, isso é junto com minha outra postagem: Reescreva não trabalhando no arquivo .htaccess

No entanto, isso não é um repost da mesma pergunta. Desta vez, estou apenas focando na primeira parte do meu arquivo .htaccess .

    SetEnv HTTPS on

<IfModule mod_rewrite.c>
    RewriteEngine On
Options -Indexes
    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA]
</IfModule>

Eu testei aqui: link e recebi o seguinte no site - informações de depuração:

Minhas perguntas:

  1. Este site é totalmente funcional (salve o que eles chamam na parte inferior da página)?

  2. O que está fazendo com que minha última linha não seja atendida?

Entrei em contato com o desenvolvedor que configurou esse arquivo .htaccess e, infelizmente, ele não conseguiu responder por que a última linha não foi atendida. Ele foi honesto e disse que esta parte do mundo Linux ele não era o mais versado, então ele acabou não sendo um bom recurso - daí a minha primeira pergunta. Eu sou um novato para reescrever as regras, por isso peço desculpas se isso é algo simples e eu só estou perdendo isso.

Por favor, deixe-me saber se este post precisa de mais esclarecimentos ou para ser formatado melhor. Obrigado a todos que podem ajudar ou explicar qualquer coisa aqui! : -)

    
por Michael Purvis 26.06.2018 / 01:01

1 resposta

2

Seu código parece "OK" e a saída que você está vendo é esperada.

RewriteRule (.+) index.php?p=$1 [QSA]

No seu exemplo, você está solicitando a raiz do documento e, sim, essa linha não corresponderá à raiz do documento em um contexto .htaccess porque o caminho da URL está vazio . O regex .+ corresponde a 1 ou mais caracteres.

Mas isso provavelmente é OK e intencional, index.php ainda deve receber a solicitação (por causa de mod_dir e DirectoryIndex ), mas sem o parâmetro p URL. Eu esperaria que seu código PHP verificasse a presença do parâmetro de URL e lidasse com isso de acordo.

Em vez disso, teste uma solicitação para example.com/foo , que contém um caminho de URL. Isso será detectado pela sua diretiva RewriteRule .

Se você quisesse sempre ter um parâmetro p URL (e talvez rejeitar a solicitação de outra forma), então você poderia alterar o padrão RewriteRule para (.*) (0 ou mais caracteres). Isso corresponderá à raiz do documento e você terminará com um parâmetro de p URL vazio. No entanto, não há realmente nenhuma vantagem em fazer isso.

(Enviei um número de relatórios de bugs para mim no passado.) Por exemplo, o exemplo a seguir resulta na referência incorreta da backreference: link (o URL resultante deve ser /foo , mas reporta /foobar , que é o URL do pedido.)

    
por 26.06.2018 / 01:54