Divida uma linha longa em um arquivo .htaccess

10

Estou definindo um cabeçalho Content-Security-Policy no meu arquivo .htaccess, e ele cresceu e se tornou uma linha única extremamente longa, que é um incômodo de gerenciar. Existe alguma maneira de dividir essa linha em substrings mais gerenciáveis?

Como um exemplo trivial, digamos que estou definindo um cabeçalho como

Header set Content-Security-Policy "deafult-src http://domainA.com; script-src http://domainB.com"

Eu posso (sem problemas óbvios de quebra) realizar meu caso específico com algo como

Header append Content-Security-Policy "default-src http://domainA.com;"
Header append Content-Security-Policy "script-src http://domainB.com"

mas isso inserirá vírgulas na string, então eu ainda estava curioso para saber se havia uma resposta melhor que pudesse ser aplicada em geral, sem adicionar caracteres adicionais à resposta.

O que seria ideal é se houvesse algum caractere de concatenação que eu pudesse usar para quebrar a cadeia em partes menores, como

Header set Content-Security-Policy "default-src http://domainA.com;"
\" script-src http://domainB.com"

ou

Header set Content-Security-Policy "default-src http://domainA.com;"^
" script-src http://domainB.com"

ou

Header set Content-Security-Policy "default-src http://domainA.com;"
+" script-src http://domainB.com"

Como alternativa, se eu pudesse definir algum tipo de variável e simplesmente despejar seu conteúdo para fazer algo como

a="default-src http://domainA.com;"
b=" script-src http://domainB.com"
Header set Content-Security-Policy $a$b

isso também seria muito mais gerenciável.

Havia um tópico semelhante que surgiu para o nginx e a conclusão era apenas para conviver com as longas filas (eles estavam lidando com um longo regex, para que a solução acrescentada não tivesse funcionado); Esse também será o caso do Apache?

MaxPRafferty
fonte
Holding segurando e pressionando enter após cada uma de suas substrings fazer o truque?
StixO
@StixO Não, este problema está relacionado ao modo como o apache analisa seqüências de caracteres em arquivos conf. Geralmente, os editores (geralmente HTML) usam esse atalho para diferenciar entre quebras de linha (digamos, <br />) e quebras de parágrafo (</p>). Isso dependerá do formato de marcação que está sendo analisado e do editor. Os arquivos conf do Apache são texto puro e, como tal, não diferenciam uma linha de um parágrafo (independentemente do modificador, enter produz um único caractere de retorno de carro dependente do sistema, como \ n ou \ r).
MaxRafferty

Respostas:

14

O seguinte deve funcionar:

 Header set Content-Security-Policy "default-src http://domainA.com; \
      script-src http://domainB.com"
Barry Pollard
fonte
Eu testei isso e consegui Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration.
kasperd
1
@kasperd você precisa executara2enmod headers
MaxPRafferty
@BazzaDP Interesting! Eu esperaria que isso fizesse com que o servidor enviasse uma nova linha que escapou, mas parece que concorda com o que eu gostaria e é imperceptível da perspectiva do cliente.
MaxPRafferty
1
Uau, na verdade, evidentemente você pode escapar de qualquer caractere de espaço em branco dessa maneira. Trabalho confirmado com \ <tab> também. .htaccess nunca será tão bom!
precisa saber é o seguinte
1
Huh, até trabalha para acabar com o regex! @ BizzaDP, você pode deixar cair esta resposta nessa pergunta do nginx que mencionei também, pode funcionar lá também.
MaxPRafferty
5

Sim - a barra invertida funciona como uma continuação de linha . Isso está oculto na documentação do Apache 2.4 em [ https://httpd.apache.org/docs/2.4/configuring.html#page-header]

Regras importantes:

  1. Espaço em branco dentro de uma linha é bom, ie. qualquer número de guias e espaços;
  2. O último caractere em todas as linhas, exceto o final, deve ser uma barra invertida; <
  3. A linha final não deve terminar com uma barra invertida;
  4. O caractere de comentário do Apache (#) não pode ser usado para comentar uma linha.

Se essas regras não forem obedecidas, o servidor responderá com um erro 500.

Steve GS
fonte