Meine Anforderung ist, dass ein Kunde, der eine Website aus dem indischen Land besucht, auf die indische Website www.example.com/in/ weitergeleitet wird . In allen anderen Fällen sollte es sich nur um eine Standardwebsite handeln.
Ich benutze die geoip
PHP-Bibliothek. Ich habe das Frontend-Ereignis verwendet controller_action_predispatch
und hier ist mein Beobachtercode:
namespace Amit\Geoip\Observer;
require_once 'lib/geoip.inc';
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Controller\ResultFactory;
use Magento\Store\Model\StoreManager;
class ControllerActionPredispatch implements ObserverInterface {
protected $resultRedirectFactory;
public function __construct(
ResultFactory $resultFactory,
StoreManager $storeManager
) {
$this->resultFactory = $resultFactory;
$this->storeManager = $storeManager;
}
public function execute(\Magento\Framework\Event\Observer $observer) {
$baseUrl = $this->storeManager->getStore()->getBaseUrl();
$gi = geoip_open(getcwd()."/app/code/Amit/Geoip/Observer/lib/GeoIP.dat",GEOIP_STANDARD);
$ip = $_SERVER['REMOTE_ADDR'];
$country_code = geoip_country_code_by_addr($gi, $ip);
if((strtoupper($country_code) == "IN")){
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
$resultRedirect->setUrl($baseUrl . '/in/' . $_SERVER['REQUEST_URI']);
}
}
}
Probleme:
- Meine Beobachterfunktion wird ausgeführt und ich erhalte das Land des Kunden von seiner IP, aber es wird nicht auf die Website www.example.com/in/* weitergeleitet . Was ist der richtige Weg, um zu meiner benutzerdefinierten URL umzuleiten?
- Ich denke, das Ereignis
controller_action_predispatch
wird die Beobachterfunktion auf jeder Seite des Kundenbesuchs aufrufen. Welches Ereignis sollte ich verwenden, damit es nur zum ersten Mal ausgeführt wird, wenn der Kunde die Website besucht? - Ich sehe, dass eine der möglichen Optionen darin besteht, ein Cookie dafür zu setzen, aber ich bin nicht sicher, wo ich das Cookie in meinem Modul setzen soll (Ereignisse? Welches Ereignis?) Und welchen Prozess ich befolgen sollte, um sie umzuleiten.
magento2
event-observer
redirect-url
geoip
amitshree
quelle
quelle
Antworten:
Es gibt mehrere Ansätze, wie Sie dies tun können, ohne Magento-Code zu bearbeiten (z. B. Webserver-Ebene). Diese Ansätze könnten effizienter sein.
Wenn Sie dies jedoch mit Magento tun möchten, sollte Ihr $ resultRedirect an zurückgegeben werden
App\Http
. Ihr Beobachter gibt $ resultRedirect nicht zurück, daher wird es nicht von verarbeitet\Magento\Framework\App\Http::launch
und eine Umleitung findet nicht statt. Da Sie möchten, dass Ihre Umleitungslogik so früh wie möglich erfolgt, jedoch nur in der Storefront (stimmt das?) Anstelle von Observer, sollten Sie ein Around-Plugin aktivieren,\Magento\Framework\App\FrontControllerInterface::dispatch
da dies die erste Methode ist, die aufgerufen wird,\Magento\Framework\App\Http::launch
nachdem area definiert und zurückgegeben wurdeResultInterface
. Über dieses Plugin können Sie Ihr$resultRedirect
Objekt zurückgeben:Wenn Sie dies nur für den ersten Kunden tun, scheint die Überprüfung der Cookie-Präsenz eine praktikable Option zu sein.
quelle
india
wird mehrmals zwischen der Basis-URL und der angeforderten URI hinzugefügt. Die Umleitungs-URL wird so etwas wie generiertexample.com/india/india/india/.../aboutus
. Warumindia
wird zwischen Basis-URL und angeforderter URL mehrmals hinzugefügt? github.com/amitshree/magento2-website-switcher/blob/master/app/…Dies sind die folgenden Schritte:
1. Weiterleitungen können auf folgende Weise erfolgen:
$observer->getControllerAction()->getResponse()>setRedirect($redirectUrl);
2. Die beste Lösung ist vielleicht die Verwendung von
controller_action_predispatch
(da es leider keine anderen, geeigneteren Ereignisse gibt).3. Im selben Beobachter können Sie auch einige Cookies einrichten (z. B. "geoip_country_code"), die von der verarbeitet werden
controller_action_predispatch.
quelle
Folgendes habe ich getan (denken Sie daran, das Aktionsflag zu setzen):
Aktualisieren:
Führen Sie für Magento 2.1.5 die folgenden Schritte aus
quelle
Anton Kril hat ein gutes Beispiel geschrieben, aber $ resultRedirect sollte den Typ \ Magento \ Framework \ App \ Response \ Http haben. Hier Beispiel aus meinem Code:
quelle