Jaka jest różnica między RewriteCond %{HTTPS} off a RewriteCond %{HTTPS} !=on?

Jaka jest różnica między RewriteCond %{HTTPS} off a RewriteCond %{HTTPS} !=on?
CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 963
1

Cześć, szukałem jak wstawić do .htaccess przekierowanie na https wersje strony.

Znalazłem dwa różne kody do tego - moje pytanie - czym one się różnią. Nie znalazłem niestety nigdzie informacji na czym polega różnica w zapisu jednej linijki - że każda z metod ma tam inną odmianę: Czyli Szukam zrozumienia różnicy.

Linijka ma jedna zapis: off a druga !=on - co oraz drobne różnice 3 linii kodu. To co będzie lepsze i czym to się różni faktycznie?

Kod 1:

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

Kod 2:

Kopiuj
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
2

Obie reguły technicznie działają podobnie, ale Kod 2 jest bardziej uniwersalny z uwagi na użycie !=on, co pozwala na objęcie większej liczby przypadków, w których HTTPS nie jest włączony.
Różnica w wzorcu (^(.)$ vs ^) w większości przypadków nie wpłynie na działanie reguły, ale ^(.)$ jest nieco bardziej kosztowne w kontekście wydajności (ze względu na dodatkową operację przechwytywania).

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1

a jakie to przypadki? Jakie inne stany może przyjąć %{HTTPS} poza on i off?

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
2

!=on sprawdza wszystkie przypadki, w których HTTPS nie jest on, czyli obsłuży również sytuacje, gdy HTTPS jest pusty, zmienna nie jest zdefiniowana lub ma inne wartości takie jak null

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2
hzmzp napisał(a):

!=on sprawdza wszystkie przypadki, w których HTTPS nie jest on, czyli obsłuży również sytuacje, gdy HTTPS jest pusty, zmienna nie jest zdefiniowana lub ma inne wartości takie jak null

ale dokumentacja https://httpd.apache.org/docs/current/mod/mod_rewrite.html
mówi:

HTTPS
Will contain the text "on" if the connection is using SSL/TLS, or "off" otherwise. (This variable can be safely used regardless of whether or not mod_ssl is loaded).

jakim cudem ma się tam pojawić inna wartość?

hzmzp napisał(a):

^(.*)$ jest nieco bardziej kosztowne w kontekście wydajności (ze względu na dodatkową operację przechwytywania).

warto wspomnieć że to tylko teoretyczna, niemierzalna i nieistotna różnica.

Prawdziwa odpowiedź brzmi - nie ma praktycznej różnicy pomiędzy tymi kodami, drugi kod wygląda na napisany przez bardziej doświadczoną osobę, ale robi dokładnie to samo

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
hzmzp napisał(a):

^(.*)$ jest nieco bardziej kosztowne w kontekście wydajności (ze względu na dodatkową operację przechwytywania).

Nie wiem skąd ta informacja, ale praktycznie każdy jeden silnik wyrażeń regularnych robi fast-return dla tego typu rzeczy, więc różnicy w wydajności nie ma żadnej (nawet niemierzalnej). Kod który robi capture'a nawet się nie wykona. Jeśli mnie pamięć nie myli to już na etapie kompilowania patternu (jeszcze przed matchowaniem, czyli zanim w ogóle przyjdzie request) to wyrażenie zostanie zastąpione internalowymi strukturami które nie będą robiły capture'a, tylko zwrócą wejściowy string.

Jedyne co da się zauważyć ("da" w cudzysłowie), to zaalokowanie pamięci dla dodatkowego elementu w zwracanym wyniku (czyli 32 bity, bo tyle trzyma referencja do stringa, lub ilość bajtów w stringu jeśli są kopiowane przez wartość).

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
1

No ale temu nie zaprzeczam efekt jest ten sam.
1 - zabezpiecza przed tym gdyby jakimś cudem się tam znalazło coś innego.
2 - co do narzutu to jest marginalny, ale zawsze jest. Raczej nie ma sensu walczyć o <1ms

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 963
1

Ziomki wszystkim daje plusa. Ale czy z tych dwóch kodów jest jakiś lepszy - czy zupełnie dowolne, który sobie wstawię na stronę z wrodpress i nie będzie dla mnie różnicy?

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
Cimron napisał(a):

Ziomki wszystkim daje plusa. Ale czy z tych dwóch kodów jest jakiś lepszy - czy zupełnie dowolne, który sobie wstawię na stronę z wrodpress i nie będzie dla mnie różnicy?

Nie musisz się tym na razie martwić.

Ja zazwyczaj w takich przypadkach stosuję rule of thumb, który kod jest prostszy/łatwiejszy do zapamiętania, w tym wypadku myślę samo ^.

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 963
1

Riddle Odpowiedź godna " moc sama wybierze Ciebie, a ty staniesz się mocą" czyli cholera wie co. Ale poradziłem sobie z tym, wstawiając ten 2 kod. :-D dla zielonego ważne było to - że uważa większość z was to wszystko za jednakowe i nieszkodliwe. Więc wylosowałem 2 - bo jest krótszy :-D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.