Encadear regras de renomeação .htaccess - a diretiva [L] é necessária?

1

Estou convertendo meu site em ssl . Meu htaccess atualmente tem regras existentes e eu quero adicionar uma regra para reescrever todos os http pedidos para https (é um servidor compartilhado e eu não tenho acesso aos arquivos de configuração, então esta é a única maneira).

As duas principais regras em questão são a primeira ( http to https ) e a última (remoção de www ).

O que estou tentando entender é o que acontecerá com as regras de encadeamento nesse caso e se eu precisar da diretiva [L] com a regra http to https rename. Eu sei que a diretiva [L] causará um loop .htaccess e seria mais eficiente fazer apenas uma passagem pelas regras, se possível. Se você não usar a diretiva [L] (com a regra http to https rename), a regra de renomeação www ainda funcionará em uma passagem?

 RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]

    #Rules for Versioned Static Files - remove timestamp
    RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L]

    #rename invalid file and directory requests
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}

    #direct favicon requests to img directory
    RewriteCond %{REQUEST_URI} !^/img/favicon.ico [NC]
    RewriteCond %{REQUEST_URI} favicon\.ico [NC]
    RewriteRule (.*) https://example.com/img/favicon.ico [R=301] 

    # remove www.
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]
    
por mseifert 12.07.2017 / 21:18

1 resposta

1

Sim, o sinalizador L ( last ) é necessário para esses redirecionamentos externos (canônicos) . "Encadeamento" não entra realmente nisso - são redirecionamentos externos - você deseja que o processamento pare o mais rápido possível e envie a resposta de redirecionamento de volta ao cliente. Se você não incluiu o L , o processamento continuará no arquivo e será reescrito para o seu front controller antes do redirecionamento ocorrer - o que é certamente o que você não quer que aconteça (como provavelmente resultará em um redirecionamento externo para /index.php?redirectroot=.... ).

Na verdade, suas diretivas estão na ordem errada. Como regra geral, redirecionamentos externos devem sempre vir antes de reescrever internos . Seus redirecionamentos canônicos (www e HTTPS) devem estar juntos, perto do topo do arquivo, não no final.

Além disso, seu redirecionamento de www para não-www redireciona para http:// , que está em conflito direto com seu redirecionamento HTTP para HTTPS, o que criará um loop desnecessário.

Seu redirecionamento HTTP para HTTPS também é inválido, pois você está perdendo um espaço antes dos RewriteRule flags.

Então, em resumo:

RewriteEngine On

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

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

#direct favicon requests to img directory
RewriteCond %{REQUEST_URI} !^/img/favicon.ico
RewriteRule favicon\.ico /img/favicon.ico [NC,L] 

#Rules for Versioned Static Files - remove timestamp
RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L]

#rename invalid file and directory requests
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}

Ao incluir seu redirecionamento www para não www antes do redirecionamento HTTPS e redirecionando para o canonical https:// , você evita dois redirecionamentos em potencial.

O sinalizador QSA não é necessário, a menos que você inclua explicitamente uma string de consulta na substituição e deseje mesclar isso com a string de consulta na solicitação. (Você não está incluindo uma string de consulta no redirecionamento www para não-www, então este sinalizador não é necessário.)

Eu mudei o seu redirecionamento para o /img/favicon.ico para uma reescrita interna . Não tem certeza porque você deseja redirecionar aqui? Eu também questionaria o uso do NC flag aqui. Você só deve tornar a partida insensível a maiúsculas e minúsculas se isso for especificamente necessário.

Além disso, removi o sinalizador NC da diretiva negada RewriteCond . Pense na lógica.

I know [L] directive will cause an .htaccess loop

Em um contexto .htaccess (diretório), o L sinalizador finaliza a passagem atual através do arquivo .htaccess . No entanto, o processamento realmente "loop", até que a solicitação passe inalterada - exceto no caso de um redirecionamento externo ( R=3xx ), que é acionado imediatamente.

    
por 13.07.2017 / 00:24