2017-06-20 7 views
0

Ich verwende PHP7, um Sitzungen mit meiner bevorzugten Steuerungsmethode zu starten: URL-Pfade. Das funktionierte [so wie ich es mache], funktioniert aber nicht in PHP7. Beginnen wir mit einem ganz normalen Hello-World-Beispiel.Session_start kann Sitzung nicht lesen, wenn/action1/action2 und nicht? Action1 = & action2 = verwendet wird

<?php 
session_start(); 
if(TRUE){ 
    $_SESSION['test'] = 'Hello World!'; 
} 
print_r($_SESSION); 
echo "<P>".session_id(); 

Führen Sie es zuerst mit WAHR und dieses Baby funktioniert perfekt. Setzen Sie es auf FALSE und Sie erhalten, was Sie erwarten. Führen Sie es immer wieder und Sie erhalten das gleiche, erwartete Ergebnis. Ich kann sogar die Sitzungsdatei besuchen und sehen, dass die Variablen gespeichert wurden.

Jetzt bin ich ein Fan der Kontrolle meines Codes mit Domain-Pfaden. E. G., example.com/action1/action2. Aktion1 wird in meiner .htaccess-Datei als PHP-Datei identifiziert und mein doc_root hat einen symbolischen Link, action1 -> index.php. Bitte beachten Sie, dies funktioniert in jeder Hinsicht außer einer ... sobald Sie diese Pfade zum URI hinzufügen, hört die Sitzung auf, die Variablen zu lesen.

Können Sie mir helfen zu verstehen, warum? Ja, die offensichtliche Lösung für die Frage: "Es tut weh, wenn ich das tue, was soll ich tun?" ist "Tu das nicht." Aber wie gesagt, ich bin ein Fan. Ehrlich gesagt, sollte das funktionieren. Der einzige Cookie ist korrekt. session_id() meldet, dass ich die gleiche Sitzungs-ID und Datei anschaue. Dieselbe Sitzungs-ID, die mit Daten gefüllt ist. Entfernen Sie die Komponente/action1/action2, und die Variablen $ _SESSION werden wieder angezeigt, genau wie wir es erwarten.

Weiß jemand, warum das passiert? Worum geht es beim Hinzufügen des Pfads, der die Sitzung deaktiviert? Warum sollte es PHP überhaupt kümmern, solange es die erwartete Session-ID hat? Ich habe sogar versucht, die Session-Datei file_get_contents(), so dass ich session_decode() den Inhalt konnte. Ohne den Aktionspfad kann ich die Datei lesen und verarbeiten. Mit dem Aktionspfad (Trommelwirbel bitte ...) kann ich die Datei nicht einmal lesen. Es ist, als ob irgendeine Art von Besitzänderung stattgefunden hat, aber ich habe die Datei- und Verzeichnisberechtigungen weit geöffnet. Irgendwelche Ideen?

.htaccess: 
RewriteEngine On 
RewriteBase/
AddHandler application/x-httpd-php70 .php 
<Files action1> 
    SetHandler application/x-httpd-php 
</Files> 

EDIT: Wenn Sie das selbst testen möchten. Speichern Sie die erste Datei unter test.php und aktualisieren Sie Ihre .htaccess-Datei wie angezeigt. Schließlich ln -s test.php action1. Führen Sie domain.com/test.php aus, um sich zu beweisen, dass die Sitzungen funktionieren. Führen Sie dann domain.com/action1 aus und beobachten Sie, wie die Variablen verschwinden.

+0

Möglicherweise ist die Sitzungsdatei gesperrt, sodass Sie sie nicht öffnen können. Es müssen nicht die Berechtigungen sein. Sie können auch die Protokollierung auf die höchsten Ebenen aktivieren und prüfen, ob Sie mehr in den Protokollen erfahren können. – hakre

+0

Ich habe 'display_errors' auf' E_ALL' gesetzt und ich habe in den '/ var/logs' Dateien gesucht. Ich bin wirklich ratlos. – JBH

+0

Und wenn Sie die Sitzungsdatei erfolglos öffnen, sehen Sie keine Warnungen? – hakre

Antwort

0

Wie sich herausstellte, war @hakre auf dem richtigen Weg, aber die Änderung löste das Problem nicht. Das Problem ist, dass Plesk direkt * .php Dateien zuordnet, die über php_fpm verarbeitet werden. In der Virtual Host Apache-Konfigurationsdatei haben wir ...

<Files ~ (\.php$)> 
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000 
</Files> 

Dies ist, wie Plesk spezifisch eine Version von PHP über eine andere nach Domänennamen anfügt. Und alles, was nicht in diese Regel fällt, wird von Apaches globalen Regeln interpretiert, die für mich eine andere Installation von PHP darstellen. (Warum Plesk keine globale Überschreibung hat, um auf ihre eigenen PHP-Installationen zu verweisen, ist ein kleines Wunder, aber ich vermute, dass dies ein Fehler ist, dem sie vorher noch nie begegnet sind.) Logischerweise müssten wir nur hinzufügen für jede Datei, die wir ohne die .php Endung verarbeiten möchten ...

<Files action1> 
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000 
</Files> 

es ist wahr, dass Sie dies tun müssen, aber für mich ist es nicht wie beworben funktionieren. Meine Webseite sagte einfach "Zugriff verweigert" und meine Fehlerdateien wiesen mich auf den Parameter security.limit_extensions von FPM hin. Mit anderen Worten, obwohl ich eine Datei, die ich ohne Suffix verwenden wollte, spezifisch identifizierte, lehnte FPM sie trotzdem ab. Hier wurde ich faul. Ich setze die Variable auf nichts zurück. In Plesk, die durch Erstellen oder Ändern einer Datei php.ini innerhalb der Domäne des conf und das Hinzufügen (einschließlich Header, wenn es nicht bereits vorhanden ist) getan ...

[php-fpm-pool-settings] 
security.limit_extensions = 

Restart Apache und dein Onkel Bob.

Nach einer sehr schnellen Google-Suche ist die Möglichkeit, FPM-Parameter direkt in Plesk zu modifizieren, immer noch umstritten.

Jetzt kommt das mit einem Preis. Aus der Perspektive des FPM-Sockets kann plötzlich jede Datei in Ihrem Webstamm als PHP-Datei ausgeführt werden, einschließlich Bilder, die Kunden hochladen und Sie blind in Ihr [ROOT]/images-Verzeichnis stellen. Sie werden teilweise durch die Tatsache gerettet, dass, wenn Sie Apache nichts anderes gesagt haben, jede alte Datei nicht als PHP-Datei interpretiert wird. Sie wären jedoch besser geschützt, wenn alle Dateien, die Sie über Ihre Site hochladen, sorgfältig geprüft werden, um sicher zu sein, dass sie genau das sind, was sie behaupten und (b) entweder außerhalb des Webstamms oder in einer Datenbank gespeichert sind kann sie ausführen, indem sie direkt auf sie verweist.

Schließlich sollte es eine Möglichkeit geben, in einer Konfigurationsdatei jene Dateien zu überschreiben, die absichtlich gegen security.limit_extensions verstoßen. Unglücklicherweise scheinen FPM und Apache nicht miteinander zu sprechen, ansonsten würde die Verwendung des Blocks die security.limit_extensions vollständig überschreiben. Nach allem, was ich weiß, gibt es einen Weg, es zu tun. Ich wäre neugierig zu wissen, aber ich habe eine funktionierende Lösung, also bin ich wieder an der Arbeit.

1

Sie sind mit zwei verschiedenen PHP-Versionen:

Der application/x-httpd-php70 Handler standardmäßig für alle .php Dateien.

Und auf der anderen Seite, die application/x-httpd-php Handler für die Datei beginnend mit action1.

Wenn Sie diesen Pfad hinzufügen, verwendet Apache eine andere PHP-Konfiguration, die möglicherweise einen anderen Sitzungsspeicher blockiert oder verwendet. Ich kann nicht konkret sagen, da ich noch nie ein solches Setup erstellt habe, aber wahrscheinlich haben Sie einfach vergessen, den gleichen Action-Handler für die Dateien zu verwenden.

Das ist Action-Handler-Konfiguration in Apache. Sehen Sie sich die Dokumentation https://httpd.apache.org/docs/2.4/handler.html an, damit Sie besser verstehen können, was vor sich geht (und vielleicht auch woher das zweite PHP kommt, sollten Sie in der Apache-Konfiguration finden können).

Verwandte Themen