RequestPreprocessor.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Store\App\FrontController\Plugin;
  7. class RequestPreprocessor
  8. {
  9. /**
  10. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  11. */
  12. protected $_scopeConfig;
  13. /**
  14. * @var \Magento\Framework\App\ResponseFactory
  15. */
  16. protected $_responseFactory;
  17. /**
  18. * @var \Magento\Framework\UrlInterface
  19. */
  20. protected $_url;
  21. /**
  22. * @var \Magento\Store\Model\StoreManagerInterface
  23. */
  24. protected $_storeManager;
  25. /**
  26. * @var \Magento\Store\Model\BaseUrlChecker
  27. */
  28. private $baseUrlChecker;
  29. /**
  30. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  31. * @param \Magento\Framework\UrlInterface $url
  32. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  33. * @param \Magento\Framework\App\ResponseFactory $responseFactory
  34. */
  35. public function __construct(
  36. \Magento\Store\Model\StoreManagerInterface $storeManager,
  37. \Magento\Framework\UrlInterface $url,
  38. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  39. \Magento\Framework\App\ResponseFactory $responseFactory
  40. ) {
  41. $this->_storeManager = $storeManager;
  42. $this->_url = $url;
  43. $this->_scopeConfig = $scopeConfig;
  44. $this->_responseFactory = $responseFactory;
  45. }
  46. /**
  47. * Auto-redirect to base url (without SID) if the requested url doesn't match it.
  48. * By default this feature is enabled in configuration.
  49. *
  50. * @param \Magento\Framework\App\FrontController $subject
  51. * @param callable $proceed
  52. * @param \Magento\Framework\App\RequestInterface $request
  53. *
  54. * @return \Magento\Framework\App\ResponseInterface
  55. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  56. */
  57. public function aroundDispatch(
  58. \Magento\Framework\App\FrontController $subject,
  59. \Closure $proceed,
  60. \Magento\Framework\App\RequestInterface $request
  61. ) {
  62. if ($this->isHttpsRedirect($request) || (!$request->isPost() && $this->getBaseUrlChecker()->isEnabled())) {
  63. $baseUrl = $this->_storeManager->getStore()->getBaseUrl(
  64. \Magento\Framework\UrlInterface::URL_TYPE_WEB,
  65. $this->_storeManager->getStore()->isCurrentlySecure()
  66. );
  67. if ($baseUrl) {
  68. $uri = parse_url($baseUrl);
  69. if (!$this->getBaseUrlChecker()->execute($uri, $request)) {
  70. $redirectUrl = $this->_url->getRedirectUrl(
  71. $this->_url->getUrl(ltrim($request->getPathInfo(), '/'), ['_nosid' => true])
  72. );
  73. $redirectCode = (int)$this->_scopeConfig->getValue(
  74. 'web/url/redirect_to_base',
  75. \Magento\Store\Model\ScopeInterface::SCOPE_STORE
  76. ) !== 301 ? 302 : 301;
  77. $response = $this->_responseFactory->create();
  78. $response->setRedirect($redirectUrl, $redirectCode);
  79. $response->setNoCacheHeaders();
  80. return $response;
  81. }
  82. }
  83. }
  84. $request->setDispatched(false);
  85. return $proceed($request);
  86. }
  87. /**
  88. * Gets base URL checker.
  89. *
  90. * @return \Magento\Store\Model\BaseUrlChecker
  91. * @deprecated 100.1.0
  92. */
  93. private function getBaseUrlChecker()
  94. {
  95. if ($this->baseUrlChecker === null) {
  96. $this->baseUrlChecker = \Magento\Framework\App\ObjectManager::getInstance()->get(
  97. \Magento\Store\Model\BaseUrlChecker::class
  98. );
  99. }
  100. return $this->baseUrlChecker;
  101. }
  102. /**
  103. * Check is request should be redirected, if https enabled.
  104. *
  105. * @param \Magento\Framework\App\RequestInterface $request
  106. * @return bool
  107. */
  108. private function isHttpsRedirect(\Magento\Framework\App\RequestInterface $request)
  109. {
  110. $result = false;
  111. if ($this->getBaseUrlChecker()->isFrontendSecure() && $request->isPost() && !$request->isSecure()) {
  112. $result = true;
  113. }
  114. return $result;
  115. }
  116. }