Dziwne zachowanie - przekierowanie HTTP na HTTPS w PHP i aplikacji Flutter

0

Nie wiem, czy "Nietuziknowe" to dobre miejsce, bo temat jest z pogranicza:

  • Mobilne (dzieje się to w aplikcji napisanej we Flutter, zarówno skompilowanej na Adroida, jak i desktopowo)
  • PHP/Webmastering (bo do tego Fluttera dane zwraca skrypt w PHP)
  • DevOps - bo może dotyczy to konfiguracji serwera

Sytuacja jest taka:

  • na serwerze Debian mam Apache
  • w opcjach domeny mam ustawione przekierowanie z HTTP na HTTPS - plik /etc/apache2/sites-available/jakasdomena.conf jest taki fragment:
    RewriteEngine on
    RewriteCond %{SERVER_NAME} = jakasdomena.com [OR]
    RewriteCond %{SERVER_NAME} =www.jakasdomena.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [NE,R=permanent]
    </VirtualHost>
    
  • w katalogu /var/www/html/jakasdomena.com/public_html mam plik .htaccess o treści:
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.php?PATH=$1 [NC,L,QSA]
    
  • w ramach testów stworzyłem 3 pliki: jeden start.php tworzy sesję, drugi check.php wyświetla jej stan, trzeci stop.php sesję zabija. Ich kod jest na dole posta (napisane tylko do testów, więc jest jak jest - ma działać i tyle ;) )
  • gdy wchodzę przez przeglądarkę na w/w adresy (typu https://jakasdomena.com/check.php) to wszystko działa zgodnie z oczekiwaniami
  • gdy wchodzę na te adresy z aplikacji we Fluttter - final response = await http.get(Uri.parse('https://jakasdomena.com/'), headers: {'Cookie': cookie}); to wartość response.body jest taka sama jak to, co wyświetla się w przeglądarce
  • jak usunę z adresu S i zamiast na HTTPS wejdę na HTTP to w przeglądarce następuje przekierowanie na HTTPS, przeglądarka pokazuje poprawną odpowiedź, a wszystkie rzeczy związane z obsługą sesji działają poprawnie (zliczanie wyświetleń, ubijanie sesji itp.)
  • jak z poziomu Fluttera wchodzę na adres bez S (czyli HTTP) to są dwie opcje:
    • jeśli w konfiguracji domeny mam [END, NE, R=permanent] to dostaję kod 200, ale odpowiedź jest pusta
    • jeśli konfiguracja domeny jest tak, jak podałem pierwotnie (czyli [NE, R=permanent] to wprawdzie dostaję odpowiedź zgodną z oczekiwaniami, ALE nic się nie dzieje z sesją - czyli jak np. odpalam stop.php to wyświetla się OFF, ale przy sprawdzaniu jej stanu to ona nadal istnieje i pamięta ilość odświeżeń/wyświetleń.

Szczerze mówiąc - nie mam pomysłu, co jeszcze zrobić/co mogę zmienić. GPT i Bard jedynie podpowiedziały dodanie/usunięcie tego END z przekierowania. Siedzę, kombinuję i nie mam pomysłu. Nie wiem nawet, po której stronie szukać błędu - może PHP/serwer, ale z drugiej strony przez przeglądarkę wszystko działa, ale kłopot jest tylko przy Flutterze. Dziwne, że serwer zwraca 200, a nie jakieś 301 czy coś typowo będącego przekierowaniem. Wszystkie sugestie mile widziane.

start.php

<?php

session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 0;
}

echo 'ON';

check.php

<?php

session_start();

$dupa = (isset($_SESSION['count'])) ? 'aktywna' : 'BRAK';

if (!isset($_SESSION['count'])) { 
  session_start();
  session_unset();
  session_destroy();
  session_write_close();
  setcookie(session_name(), '', 0, '/');
  session_regenerate_id(true);
} else {                          
  $_SESSION['count']++;        
};

echo 'Stan SESJI: ' . $dupa . '<br><br>';
echo 'count: ' . $_SESSION['count'];

stop.php

<?php

session_start();
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(), '', 0, '/');
session_regenerate_id(true);

echo 'OFF';
1

Widzę jakby dwie nieścisłości w konfiguracji.
Masz przekierowanie na index.php - to tam jest jakaś aplikacja która z tego korzysta?
Certyfikat jest skąd? Bo może masz komunikację przez przeglądarkę bo zezwoliłeś na użycie niepodpisanego certu a apka wymaga do tego innych ustawień.
W PHP jest w php.ini flaga dla cookies http_only Może zobacz co masz ustawione, może to inna kwestia typu nagłówki z tej aplikacji.

1

Dla tego RewriteRule, to kwestia formatowania posta, czy faktycznie masz ^(.)$ ( może brakuje gwiazdki w wyrażeniu i powinno być ^(.*)$ ) ?

0

Od strony klienta, sprawdź jakimś curl-em co się rzeczywiście dzieje. Testy w przeglądarce są takie średnie, a jeśli już to zobacz ruch sieciowy w dev tools.
A tak btw, to nie powinieneś iść tą drogą. Nie używaj http tylko https.

0

Chłopaki - dzięki za sugestie. Już się ustosunkowuję:

Masz przekierowanie na index.php

@jurek1980 - jest przekierowanie, ale zwróć uwagę na fragment RewriteCond %{REQUEST_FILENAME} !-f - jeśli podany URL wskazuje na plik, to ma załadować ten plik, nie stosujemy przekierowania. Także to chyba nie ma znaczenia.

Certyfikat jest skąd?

NA VPS'ie mam Let's encrypt, ale wystawione jest na świat przez CloudFlare, więc dla usra końcowego raczej SSL jest CloudFlare'owy

apka wymaga do tego innych ustawień.

No ale czy nie jest tak, że jakby apka nie uznawała certyfikatu to by jakiś błąd/wyjątek poleciał, a nie HTTP 200?

Dla tego RewriteRule, to kwestia formatowania posta, czy faktycznie masz ^(.)$ ( może brakuje gwiazdki w wyrażeniu i powinno być ^(.*)$ ) ?

@yarel - coś się źle wkleiło/źle sformatowało. W pliku .htaccess mam daszek nawias kropka gwiazdka nawias_zamknąć dolar. Plus dla Pana za czujność ;)

Od strony klienta, sprawdź jakimś curl-em co się rzeczywiście dzieje. Testy w przeglądarce są takie średnie, a jeśli już to zobacz ruch sieciowy w dev tools.

Tak, sprawdzę to. Tylko wydaje mi się, że przekierowanie powinno być zrobione przez serwer niezależnie od tego, kto i jak się łączy.

1

Panie @cerrato, to jeszcze jedno pytanie, RewriteRule ^(.*)$ http://%1/$1 [R=301,L] , czemu http, a nie https?

1

Mały update. Podejrzewam, że tutaj CloudFlare może mieszać.

Po odpaleniu tego w Postmanie TEGO SAMEGO URL, który wpisuję do przeglądarki i/lub daje w apce Flutter, dostaję taką odpowiedź:

<html>
<head>
	<title>400 Bad Request</title>
</head>

<body>
	<center>
		<h1>400 Bad Request</h1>
	</center>
	<hr>
	<center>cloudflare</center>
</body>
</html>

Jakiś pomysł, o co może chodzić/co może być punktem zaczepienia? Czemu wpisując w to w Postamana mam jakiś 400 Bad request (niezależnie, czy dam http:// czy https://), ale ten sam adres w przeglądarce zwraca to, co powinien?

UPDATE
Po przełączeniu w ustawieniach tej domeny w Cloudflare Development Mode na ON w postmanie pokazuje się treść taka, jaka powinna, ale Flutter nadal zachowuje się w sposób opisany w pierwszym poście

1 użytkowników online, w tym zalogowanych: 0, gości: 1