Magento 2: User login sometimes requires to login twice on multi store setup
-
04-10-2020 - |
Question
I am trying to setup a multi store with shared cart. However, the user login sometimes does not work.
The Store Switcher
works fine, but the frontend User Login
on 2nd and 3rd Store
requires me to click the Sign In
button twice to login.
I have setup multi stores with these setups:
Multi Domain (Virtual Hosts)
I am using one Website
. The site will have three Stores
. The domain names will share one common base domain. The additional stores will use subdomains.
I created magento2.com as the default base domain.
I created store2.magento2.com as the 2nd store.
I created store3.magento2.com as the 3rd store.
Root Categories and Test Products
I created Store2 Root Category and Store3 Root Category. I also created sub categories under each Root Category.
I added one test product to each sub category.
Stores and Views
I did NOT change anything on Main Website Store and Default Store View.
I created Store2 and Store View 2 for 2nd store.
I created Store3 and Store View 3 for 3rd store.
For Store2, I set Store2 as Name
and selected Store2 Root Category as Root Category
.
For Store View 2, I selected Store2 as Store
, used Store View 2 as Name
, and entered store2 as Store Code
.
For 3rd Store
, I set Store3 as Name
and selected Store3 Root Category as Root Category
.
For Store View 3, I selected Store3 as Store
, used Store View 3 as Name
, and entered store3 as Store Code
.
URL and Cookie setting
The Configuration
screen now shows 5 choices under Store View
drop-down:
Default Config
Main Website
Default Store View
- Store View 2
- Store View 3
I changed URL and Cookie settings for Default Store View
, Store View 2, and Store View 3.
I did NOT change URL or Cookie settings for Default Config
and Main Website
.
For Default Store View
, I changed Cookie Path
.
For Store View 2, I changed Base URL
and Cookie Path
.
For Store View 3, I changed Base URL
and Cookie Path
.
Account Sharing
To share user accounts and shopping cart among multiple stores, I changed Share Customer Accounts
from "Per Website" to Global under Default Config
.
.htaccess change
I added these lines at the top of .htaccess
file at the project root directory.
#Multi store setting
SetEnvIf Host magento2.com MAGE_RUN_CODE=default
SetEnvIf Host magento2.com MAGE_RUN_TYPE=store
SetEnvIf Host ^magento2.com MAGE_RUN_CODE=default
SetEnvIf Host ^magento2.com MAGE_RUN_TYPE=store
SetEnvIf Host store2.magento2.com MAGE_RUN_CODE=store2
SetEnvIf Host store2.magento2.com MAGE_RUN_TYPE=store
SetEnvIf Host ^store2.magento2.com MAGE_RUN_CODE=store2
SetEnvIf Host ^store2.magento2.com MAGE_RUN_TYPE=store
SetEnvIf Host store3.magento2.com MAGE_RUN_CODE=store3
SetEnvIf Host store3.magento2.com MAGE_RUN_TYPE=store
SetEnvIf Host ^store3.magento2.com MAGE_RUN_CODE=store3
SetEnvIf Host ^store3.magento2.com MAGE_RUN_TYPE=store
index.php change
Using the Store Switcher
, sometimes required to click twice to switch from store2/3 to the default. To fix this, I had to reset the value for $_COOKIE['store']
at the index.php:
<?php
/**
* Application entry point
*
* Example - run a particular store or website:
* --------------------------------------------
* require __DIR__ . '/app/bootstrap.php';
* $params = $_SERVER;
* $params[\Magento\Store\Model\StoreManager::PARAM_RUN_CODE] = 'website2';
* $params[\Magento\Store\Model\StoreManager::PARAM_RUN_TYPE] = 'website';
* $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);
* \/** @var \Magento\Framework\App\Http $app *\/
* $app = $bootstrap->createApplication('Magento\Framework\App\Http');
* $bootstrap->run($app);
* --------------------------------------------
*
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
try {
require __DIR__ . '/app/bootstrap.php';
} catch (\Exception $e) {
echo <<<HTML
<div style="font:12px/1.35em arial, helvetica, sans-serif;">
<div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
<h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
Autoload error</h3>
</div>
<p>{$e->getMessage()}</p>
</div>
HTML;
exit(1);
}
// Fix store switcher bug on switching to the default store
if ( isset($_SERVER['MAGE_RUN_TYPE']) == 'store' && isset($_SERVER['MAGE_RUN_CODE']) ) {
if ( !empty($_SERVER['MAGE_RUN_CODE']) ) {
$_COOKIE['store'] = $_SERVER['MAGE_RUN_CODE'];
}
}
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$bootstrap->run($app);
User login sometimes requires to click twice
With the above setup, the Store Switcher
is working fine. The shopping Cart
is shared among all 3 Stores for both logged-in and not-logged-in users.
However, on Store2 and Store3, the frontend user login
sometimes redirects back to the same login page. If I press the Sign In
button on the redirected login page (2nd time to click this button), it let's me login.
Is there a way to fix this problem?
Update: disabling Cache
I disabled the caching from command line:
php bin/magento cache:disable
With disabled cache, the user login
on Store2 and Store3 became much more stable. It still redirected back to the login page 1 out of 10 attempts, but this change made the login to work better.
However, the entire site became slow!!!
Is there a way to properly configure the cache to make the user login
to perform correctly on a multi Store
setup?
Solution
We managed to make the store switcher and login a bit more stable with new configuration.
Add Store Code to Urls
The biggest change was setting Add Store Code to Urls
to "Yes".
Stores =>
Configuration in Settings section =>
select Default Config
=>
Web in GENERAL section =>
Url Options =>
change the Add Store Code to Urls
to "Yes"
Remove Cookie Domain
Then, we removed Cookie Domain
value from Store2 and Store3 from the Configuration page.
Stores =>
Configuration in Settings section =>
select Store2 or Store3 =>
Web in GENERAL section =>
Default Cookie Settings =>
remove the value from Cookie Domain
and leave it blank
Remove custom codes from .htaccess
and index.php
Then, we removed custom code lines form .htaccess
and index.php
.
With the new configuration, the customization on these files were no longer needed. This is great, cleaner code.
After these changes, the store switcher, shared shopping cart, and user login became much more stable. Make sure you clear the cache after you make these changes.
Magento2 core upgrade and its effect on .htaccess
and index.php
Before making config and file changes, we upgraded the Magento2 core from 2.1.0 to 2.1.3 using composer
. (Reference: Update Magento 2.1.2 for 2.1.3 )
We are not sure this will be a required part for this multi store configuration, but we performed it hoping the site will be more stable with latest updates from 2.1.3
We had 3 files modified which which were part of core and module files (these files are ignored by our Git version control):
- .htaccess
- index.php
- dev/tools/grunt/configs/themes.js (Grunt config file to compile our custom theme css)
When we upgraded Magento2, these files are reset to initial state of 2.1.3. We did NOT have to manually clean up our .htaccess
and index.php
files. The file contents were automatically reset by the upgrade. This was a positive side effect.
But there was also a bad side effect. Our custom code in the Grunt config file was reset and erased by the core upgrade. We had to manually restore our custom code lines on this file.
I recommend to take file and DB backups before doing this core upgrade and config/file changes.
Minifying Javascript might help
Minifying JS made the entire site more stable on our site.
Stores =>
Configuration in Settings section =>
select Default Config
=>
Developer in ADVANCED section =>
JavaScript Settings =>
set Merge JavaScript Files
to "Yes" =>
set Enable JavaScript Bundling
to "Yes" =>
set Minify JavaScript Files
to "Yes" =>
then, clear cache