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ę, drugicheck.php
wyświetla jej stan, trzecistop.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. odpalamstop.php
to wyświetla sięOFF
, ale przy sprawdzaniu jej stanu to ona nadal istnieje i pamięta ilość odświeżeń/wyświetleń.
- jeśli w konfiguracji domeny mam
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';