Ich hab ein Plugin entwickelt, das die Client-IP abfragt und anhand von dieser eine Datenbankabfrage startet. Ich greif über den Wert $_SERVER[‚REMOTE_ADDR‘] auf die IP zu. Das ganze mach ich im RouteSoubscriber nach dem Event ‚Enlight_Controller_Action_PostDispatchSecure_Frontend‘.
Im Live-System habe ich festgestellt, dass die Client-IP gecacht wird und letztenendlich alle Anfragen mit der gleichen IP erscheinen.
Gibt es eine Möglichkeit den Cache für dieses Plugin zu deaktivieren oder eine andere Möglichkeit auf die IP jedes Requests zuzugreifen ohne Caching?
In einem anderem Post hier im Forum hab ich die Möglichkeit gesehen, mit Enlight_Controller_Request_Request :: getClientIp() auf die IP zuzugreifen, aber darauf bekomm ich kein Zugriff.
Btw. ist auch $_SERVER[‘REMOTE_ADDR’] kein verlässicher Indikator für die IP des Besuchers. Wenn der einen Proxy nutzt (Varnish, SSL-Proxy, Loadbalancer, …). Dann ist die IP-Adresse in X-FORWARDED-FOR: X-Forwarded-For – Wikipedia
In $_SERVER[‘REMOTE_ADDR’] steht dann die IP des Proxies.
HTTP_X_FORWARDED_FOR steht nicht immer zur Verfügung. Benutzt jemand z.B. einen Tor Browser so steht dieser Wert nicht zur Verfügung. Und für Firefox gibt es eine Erweiterung, der diesen Eintrag vortäuscht. Da fahre ich doch mit REMOTE_ADDR oder HTTP_X_REAL_IP besser?
HTTP_X_FORWARDED_FOR steht nicht immer zur Verfügung. Benutzt jemand z.B. einen Tor Browser so steht dieser Wert nicht zur Verfügung. Und für Firefox gibt es eine Erweiterung, der diesen Eintrag vortäuscht. Da fahre ich doch mit REMOTE_ADDR oder HTTP_X_REAL_IP besser?
Naja, wie gesagt steht in REMOTE_ADDR bei einem Proxy in der Regel die IP des Proxies und nicht die des Besuchers. Damit Shopware die IP des Benutzers hinter einem Proxy noch tracken kann, muss man i.d.R. die trustedProxies konfigurieren - wenn das in der config.php eingerichtet ist, wertet Shopware die x-Header aus.
Quasi „Wenn in der REMOTE_ADDR die IP des trustedProxies steht, dann werte X-FORWARDED-FOR aus, sonst ignoriere das“.
Insofern muss einem nur bewusst sein, dass in REMOTE_ADDR eben nicht immer die IP des Clients steht, sondern auch häufig die IP des Proxies.
Das hat mit dem Client nicht viel zu tun, da das X-FORWARDED-FOR vom Proxy gesetzt wird.
Also ich würde auch auf real-ip setzen. Problem in Shopware ist hier jedoch, das getClientIP() immer nur
return $this->getServer('REMOTE_ADDR');
zurückschmeißt.
Das ist auch alles nicht Hookable oder sonst irgendwie gut anzufassen und um Proxy-Checks zu erweitern. Habe da auf jeden Fall direkt mal keinen Ansatz gesehen bei welchem man das zufriedenstellend hinbiegen kann.
Ich würde einen check auf real-ip machen wenn das leer ist, dann als fallback die getClientIp aufrufen und den Wert nehmen.
Also ganz banal und wie eigentlich nicht empfohlen eiskalt auf
Danke für den Hinweis. Leider gibts die Funktion nicht - Fehlermeldung: „Call to undefined function MyPlugin\Subscriber\Request()“. Oder muss ich diese erst importieren?
Bzgl. der verschiedenen Methoden wie ich auf dei IP zugreife: das Problem ist nicht eine IP zu erhalte. Das will ich an der Stelle erst mal vernachlässigen.
Das Problem ist:
User A mit IP 1.1.1.1 greift zu und seine IP wird richtig erkannt.
Danach greift User B mit IP 2.2.2.2 zu, das Plugin gibt aber als IP 1.1.1.1 - vom User A aus.
Wie kann ich an der Stelle das Caching umgehen oder einen aktuellen Wert erhalten?
Danke für den Hinweis. Leider gibts die Funktion nicht - Fehlermeldung: „Call to undefined function MyPlugin\Subscriber\Request()“. Oder muss ich diese erst importieren?
Ich weis nicht wie dein Plugin aufgebaut ist und an welcher Stelle du das Request benötigst. Das muss natürlich angepasst werden. Daher hier nur ein Beispiel (ungetestet):
public static function getSubscribedEvents() {
$events = Array(
'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontendPostDispatch'
);
return $events;
}
public function onFrontendPostDispatch(\Enlight_Event_EventArgs $arguments) {
$controller = $arguments->getSubject();
$request = $controller->Request();
$ip = $request->getClientIp();
}
Aktuell haben wir es mit Action Tags gelöst. Was genau ist refreshStatistics? Dazu finde ich keine Doku - auch nicht in den Links, oder hab ich was übersehen?