Podziel długą linię w pliku .htaccess

10

W moim pliku .htaccess ustawiam nagłówek Content-Security-Policy, który urósł do bardzo długiej pojedynczej linii, co sprawia kłopot. Czy jest jakiś sposób na podzielenie tej linii na łatwiejsze do zarządzania podciągi?

Jako trywialny przykład, powiedzmy, że ustawiam nagłówek podobny do

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

Mogę (bez oczywistych problemów z przerwaniem) zrealizować mój konkretny przypadek za pomocą czegoś takiego

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

ale to wstawi przecinki do ciągu, więc wciąż byłem ciekawy, czy istnieje lepsza odpowiedź, którą można by zastosować ogólnie, bez dodawania dodatkowych znaków do odpowiedzi.

Idealne byłoby, gdyby istniał jakiś znak konkatenacji, którego mógłbym użyć do podzielenia łańcucha na mniejsze części, na przykład

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

lub

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

lub

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

Alternatywnie, gdybym mógł ustawić jakąś zmienną i po prostu zrzucić jej zawartość, aby zrobić coś takiego

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

byłoby to również o wiele łatwiejsze w zarządzaniu.

Było podobny wątek, który pojawił się na nginx i konkluzja była po prostu żyć z długich kolejkach (oni mieli do czynienia z długą regex, więc rozwiązanie Dołącz by nie pracował); Czy tak też będzie w przypadku Apache?

MaxPRafferty
źródło
Czy przytrzymanie klawisza shift i naciśnięcie klawisza enter po wykonaniu każdego z podciągów?
StixO
@StixO Nie, ten problem dotyczy sposobu, w jaki apache analizuje ciągi znaków w plikach conf. Zasadniczo (zwykle HTML) redaktorzy używają takiego skrótu do rozróżnienia podziałów linii (powiedzmy <br />) i podziałów akapitów (</p>). Będzie to zależeć od analizowanego formatu znaczników i edytora. Pliki conf Apache są czystym tekstem i jako takie nie mają rozróżnienia między wierszem akapitu (niezależnie od modyfikatora, enter tworzy pojedynczy, zależny od systemu znak powrotu karetki, taki jak \ n lub \ r).
MaxPRafferty

Odpowiedzi:

14

Następujące powinny działać:

 Header set Content-Security-Policy "default-src http://domainA.com; \
      script-src http://domainB.com"
Barry Pollard
źródło
Przetestowałem to i dostałem Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration.
kasperd
1
@kasperd musisz uruchomića2enmod headers
MaxPRafferty
@BazzaDP Ciekawe! Spodziewałbym się, że spowodowałoby to wysłanie przez serwer nowej linii, ale wygląda na to, że kończy się tak, jak bym chciał, i jest niezauważalny z perspektywy klienta.
MaxPRafferty
1
Wow, najwyraźniej w ten sposób możesz uciec przed dowolną białą postacią. Potwierdzono także pracę z \ <tab>. .htaccess nigdy nie wyglądałby tak dobrze!
MaxPRafferty
1
Huh, nawet działa, by zerwać wyrażenia regularne! @BazzaDP, możesz upuścić tę odpowiedź na pytanie nginx, o którym również wspomniałem, może tam również działać.
MaxPRafferty
5

Tak - odwrotny ukośnik działa jako kontynuacja linii . Jest to zakopane w dokumentacji Apache 2.4 na [ https://httpd.apache.org/docs/2.4/configuring.html#page-header]

Ważne zasady:

  1. Biała spacja w linii jest w porządku, tj. dowolna liczba tabulatorów i spacji;
  2. Ostatni znak we wszystkich wierszach oprócz ostatniego musi być odwrotnym ukośnikiem; <
  3. Ostatnia linia nie może kończyć się odwrotnym ukośnikiem;
  4. Znak komentarza Apache (#) nie może być używany do komentowania linii.

Jeśli te zasady nie będą przestrzegane, serwer odpowie błędem 500.

Steve GS
źródło