Repository navigation
Store switch endless loop, wrong navigation block content (wrong store) with multidomain/language setup #3676
Description
Steps to reproduce
- Install Magento release 2.0.2)
1a. Disable Fullpage and block cache (just to avoid caching effects) - Setup multistore setup with nginx:
This setup is meant to handle country domains with a (not unique between stores) language prefix for urls.
E.g.
http://mysite.de/
http://mysite.de/en-DE/
http://mysite.at/
http://mysite.at/en-AT/
http://mysite.ch/
http://mysite.ch/en-CH/
a)
server {
server_name mysite.de
# handle default requests
location ~ (index|get|static|report|console|404|503)\.php$ {
# set base store for this domain
fastcgi_param MAGE_RUN_CODE base_de_de;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# handle language code requests like mysite.de/en-DE/...
location ~ "\/([a-zA-Z]{2})\-([a-zA-Z]{2})(\/?)(.*)$" {
fastcgi_param MAGE_RUN_CODE base_$1_$2; # will result in e.g. base_en_de
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $MAGE_ROOT/pub/index.php;
include fastcgi_params;
# overwrite paths with cleanup of language code
fastcgi_param REQUEST_URI $3$4;
}
}
b)
server {
server_name mysite.at
# handle default requests
location ~ (index|get|static|report|console|404|503)\.php$ {
# set base store for this domain
fastcgi_param MAGE_RUN_CODE base_de_at;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# handle language code requests like mysite.at/de-AT/...
location ~ "\/([a-zA-Z]{2})\-([a-zA-Z]{2})(\/?)(.*)$" {
fastcgi_param MAGE_RUN_CODE base_$1_$2; # will result in e.g. base_en_at
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $MAGE_ROOT/pub/index.php;
include fastcgi_params;
# overwrite paths with cleanup of language code
fastcgi_param REQUEST_URI $3$4;
}
}
c)
server {
server_name mysite.ch
# handle default requests
location ~ (index|get|static|report|console|404|503)\.php$ {
# set base store for this domain
fastcgi_param MAGE_RUN_CODE base_de_ch;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# handle language code requests like mysite.at/de-AT/...
location ~ "\/([a-zA-Z]{2})\-([a-zA-Z]{2})(\/?)(.*)$" {
fastcgi_param MAGE_RUN_CODE base_$1_$2; # will result in e.g. base_en_ch
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $MAGE_ROOT/pub/index.php;
include fastcgi_params;
# overwrite paths with cleanup of language code
fastcgi_param REQUEST_URI $3$4;
}
}
- Store Configuration
Store 1:
Name: My Store (Renamed the default)
Root Category: use default
Default Store View: DE - DE
Website 1 (Default):
Name: My Website (Renamed the default)
Code: base
Default Store: My Store
Store Views 1:
Name: DE - DE (renamed default)
Code: base_de_de
Backend Base Url: http://mysite.de/
Backend Base Link Url: http://mysite.de/
Store Views 2:
Name: EN - DE
Code: base_en_de
Backend Base Url: http://mysite.de/
Backend Base Link Url: http://mysite.de/en-DE/
Store Views 3:
Name: DE - AT
Code: base_de_at
Backend Base Url: http://mysite.at/
Backend Base Link Url: http://mysite.at/
Store Views 4:
Name: EN - AT
Code: base_en_at
Backend Base Url: http://mysite.at/
Backend Base Link Url: http://mysite.de/en-AT/
Store Views 5:
Name: DE - CH
Code: base_de_ch
Backend Base Url: http://mysite.ch/
Backend Base Link Url: http://mysite.ch/
Store Views 6:
Name: EN - CH
Code: base_en_ch
Backend Base Url: http://mysite.ch/
Backend Base Link Url: http://mysite.de/en-CH/
Expected result
- Switching between stores will work as expected
- Content will be shown as configured for the store
Actual result
- Switching between stores works some time - but at some point you can't get back to the default stores views.
Additional, at some time endless redirect loops occur between 2 of the stores after switching.
Can only be fixed by closing browser AND clearing session table AND clearing cache via commandline. - If you call the store with mysite.de you will get
a) OK a correct store switcher preselection
b) OK a correct content (some configured cms page)
c) NOT OK Top Navigation links will show links with a
language/country prefix and url from the other store (e.g. mysite.ch/en-CH/somecategory.html even if you are on mysite.de.
Reload of the page will sometimes bring the correct results for the store, sometimes navigation from an other store (wrong too).
I even checked the context in the navigation block by echo of store id: it's correctly showing the expected store.
Hope that someone has an idea what went wrong here.
Activity
m-strojek commentedon Mar 9, 2016
I figured out a modification which fixes the problem of endless redirects / wrong redirects.
Seems that the cookie value wins before the server value - so if you open some host which sets the store code to A but you have B as cookie value you will be redirected to store B.
Solution would be to override the cookie value in pub/index.php
if ( isset($_SERVER['MAGE_RUN_TYPE']) == 'store' && isset($_SERVER['MAGE_RUN_CODE']) ) {
if ( !empty($_SERVER['MAGE_RUN_CODE']) ) {
$_COOKIE['store'] = $_SERVER['MAGE_RUN_CODE'];
}
}
$params = $_SERVER;
avra911 commentedon May 12, 2016
Have the same issue on a sub-domain multi stores.
After using site store switcher on front, is entering in loop in back-end page.
When browsing the stores, just by typing in the URL, without using the switcher, there is no problem.
rickwhitehead commentedon Jun 8, 2016
Having the same issue on a simple one website 2 stores site configuration.
Can be reproduced only if store switcher is used - this sets a 'store' cookie which is not updated correctly when the switcher is used repeatedly and remains set to the initial switch - haven't tried adding another store but suspect it still won't update as expected. Will try to offer a fix suggestion soon.
srbarba commentedon Jun 10, 2016
Have the same issue, some fix please
[SOLVED] The problem was the $_COOKIE['store]
GianniPDF commentedon Jun 10, 2016
Looks like m-strojek fix works! Ty
piotrekkaminski commentedon Jun 20, 2016
Closing as solution is available above.
gewaechshaus commentedon Jul 17, 2016
THX @m-strojek
ctadlock commentedon Jan 4, 2017
@piotrekkaminski Im confused as to why this issue is closed. While the solution that @m-strojek provided works, shouldn't this be added to the Magento code? Why should all of the store owners need to make this fix themselves?
ctadlock commentedon Feb 11, 2017
@piotrekkaminski Again, why is this closed?
sabei commentedon Apr 25, 2017
thanks @m-strojek.
sabei commentedon Apr 25, 2017
Why is the solution not added to the core code? Is there any other reason?
maderlock commentedon May 17, 2017
This "fix" would break the standard store switcher that replies on cookies overriding server settings. The standard approach is for the server to set a default store, and then your cookie determines whether a different store is used. So adding this to the core code might solve your situation, but it would break other people's sites, so it's unlikely to be done.
Merge pull request #3676 from magento-qwerty/2.3-bugfixes-310119