Разбейте длинную строку в файле .htaccess

10

Я устанавливаю заголовок Content-Security-Policy в моем файле .htaccess, и он вырос до очень длинной отдельной строки, которой сложно управлять. Есть ли способ разбить эту строку на более управляемые подстроки?

В качестве тривиального примера, скажем, я устанавливаю заголовок, как

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

Я могу (без очевидных проблем) решить мой конкретный случай с чем-то вроде

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

но это вставит запятые в строку, поэтому мне все еще было любопытно, был ли лучший ответ, который можно было бы применить вообще, без добавления дополнительных символов в ответ.

Что было бы идеально, если бы был какой-либо символ конкатенации, который я мог бы использовать, чтобы разбить строку на более мелкие части, например

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

или

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

или

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

Кроме того, если бы я мог установить какую-то переменную и просто сбросить их содержимое, чтобы сделать что-то вроде

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

это также было бы намного более управляемым.

Была похожая тема, которая возникла для nginx, и вывод заключался в том, чтобы просто жить с длинными строками (они имели дело с длинным регулярным выражением, поэтому решение добавления не сработало бы); Так будет и с Apache?

MaxPRafferty
источник
Удастся ли удерживать shift и нажать enter после каждой из ваших подстрок?
StixO
@StixO Нет, эта проблема связана с тем, как apache анализирует строки в файлах conf. Обычно (обычно HTML) редакторы используют такой ярлык, чтобы различать разрывы строк (скажем, <br />) и разрывы абзацев (</ p>). Это будет зависеть от анализируемого формата разметки и редактора. Confache файлы Apache представляют собой чистый текст, и поэтому не имеют различий между строкой абзаца (независимо от модификатора, enter создает единственный системно-зависимый символ возврата каретки, такой как \ n или \ r).
MaxPRafferty

Ответы:

14

Следующее должно работать:

 Header set Content-Security-Policy "default-src http://domainA.com; \
      script-src http://domainB.com"
Барри Поллард
источник
Я проверил это и получил Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration.
kasperd
1
@kasperd вам нужно бежатьa2enmod headers
MaxPRafferty
@BazzaDP Интересно! Я ожидал бы, что это приведет к тому, что сервер отправит экранированный символ новой строки, но кажется, что он соответствует желаемому и незаметен с точки зрения клиентов.
MaxPRafferty
1
Вау, на самом деле, очевидно, вы можете избежать любого символа пробела таким образом. Подтвердил также работу с \ <tab>. .htaccess никогда не выглядел бы так хорошо!
MaxPRafferty
1
Да, даже работает, чтобы разбить регулярное выражение! @BazzaDP, вы можете отказаться от этого ответа на тот вопрос nginx, о котором я упоминал, он тоже может сработать.
MaxPRafferty
5

Да - обратный слеш работает как продолжение строки . Это скрыто в документации Apache 2.4 по адресу [ https://httpd.apache.org/docs/2.4/configuring.html#page-header].

Важные правила:

  1. Пробел внутри строки - это нормально, т.е. любое количество знаков табуляции и пробелов;
  2. Последний символ во всех строках, кроме последнего, должен быть с обратной косой чертой; <
  3. Последняя строка не должна заканчиваться обратной косой чертой;
  4. Символ комментария Apache (#) нельзя использовать для закомментирования строки.

Если эти правила не соблюдаются, сервер ответит с ошибкой 500.

Стив Г.С.
источник