Mod_rewrite está adicionando / var / www ao URL resultante

1

Eu tenho alguns problemas com as regras do mod_rewrite do Apache. Sempre que tento ir para https://example.com// (veja barras duplas no final), ele redireciona para uma página 301, mas está adicionando a localização do diretório, ou seja, https://example.com/var/www/my-domain.com/html , o que não é desejável.

Aqui está o meu arquivo .htaccess :

ErrorDocument 404 /views/pages/404.php

RewriteEngine on

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S+) [NC]
RewriteRule ^(.*) [L,R=404]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=301,L]

RewriteRule ^contact-us/?$ views/pages/contact.php [NC,L]

O mesmo acontece quando vou para https://example.com//contact-us

https://example.com/contact-us// está redirecionando bem para https://example.com/contact-us e https://example.com//contact-uss está redirecionando bem para a página 404.

Se precisar de mais informações, me avise.

    
por resizemyimg.com 10.11.2018 / 07:20

1 resposta

1

Copiado de minha resposta no StackOverflow para a mesma pergunta:
link

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=301,L]

Você está perdendo o prefixo de barra na substituição . Isso resulta em uma substituição de caminho relativo (desde que o $1 backreference não contenha o prefixo de barra), para o qual mod_rewrite prefixa o prefixo de diretório (ou seja, /var/www/example.com/html ). Isso resultaria no redirecionamento malformado que você está vendo. O RewriteRule deve ser escrito como:

RewriteRule (.*) /$1 [R=301,L]

(A ^ âncora no padrão RewriteRule é desnecessária aqui.)

No entanto, o seguinte redirecionamento também é inválido:

RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S+) [NC]
RewriteRule ^(.*) [L,R=404]

Você está perdendo o argumento substituição . [L,R=404] será visto como a string substituição (não as flags , como pretendido). Isso também resultaria em uma reescrita / redirecionamento malformada. O RewriteRule deve ser escrito como:

RewriteRule (.*) - [R=404]

Observe que o - (single hyphen) é usado como o argumento substituição (que é ignorado mais tarde). Ao especificar um código de resposta não 3xx, o sinalizador L está implícito.

No entanto, estou curioso sobre o que você está tentando fazer aqui, já que você parece estar "aceitando" várias barras em uma diretiva (reduzindo elas), mas rejeitando várias barras. em outra diretiva (com um 404)? Por que não reduzir todas as sequências de várias barras sempre que ocorrerem no caminho da URL?

Por exemplo, substitua o seguinte (código modificado):

# Remove trailing slash from URL (except files and directories)
# >>> Why files? Files don't normally have trailing slashes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Reject multiple slashes later in the URL or 3+ slashes at the start of the URL
RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S+) [NC]
RewriteRule (.*) - [R=404]

# Reduce multiple slashes at the start of the URL
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule (.*) /$1 [R=301,L]

Com algo como o seguinte (dependendo dos requisitos):

# Reduce sequences of multiple slashes to a single slash in the URL-path
# NB: This won't work to reduce slashes in the query string (if that is an issue)
RewriteCond %{THE_REQUEST} \s[^?]*//+
RewriteRule (.*) /$1 [R=302,L]

# Remove trailing slash from URL (except directories)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=302,L]

Observe que inverti as diretivas para reduzir as barras antes que a barra final seja removida.

Observe que o regex \s[^?]*//+ verifica especificamente várias barras apenas no caminho da URL, excluindo a string de consulta. Isso é importante se várias barras puderem legitimamente ocorrer na cadeia de consulta , pois a diretiva RewriteRule reduz apenas várias barras no caminho da URL. Caso contrário, você obteria um loop de redirecionamento.

Teste com 302s para evitar problemas de armazenamento em cache. E limpe o cache do seu navegador antes de testá-lo.

    
por 13.11.2018 / 02:11