Skip to content

Commit 5413502

Browse files
author
Oleksii Korshenko
committed
MAGETWO-70505: [2.1-backport] Fix trailing slash used in url rewrites #10164
- Merge Pull Request #10164 from ihor-sviziev/magento2:patch-8 - Merged commits: 1. c021b6f 2. f1e80e9 3. 0e9575d 4. 86a3227 5. 7d88a9b 6. d1a0703 7. 8ced0da 8. d950a82 9. 82a7dce 10. ad3f213 11. 4df2dcb
2 parents 4b2cc99 + 4df2dcb commit 5413502

File tree

9 files changed

+500
-26
lines changed

9 files changed

+500
-26
lines changed

app/code/Magento/Store/Model/BaseUrlChecker.php

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,10 @@ public function __construct(
3434
public function execute($uri, $request)
3535
{
3636
$requestUri = $request->getRequestUri() ? $request->getRequestUri() : '/';
37-
38-
return (!isset(
39-
$uri['scheme']
40-
) || $uri['scheme'] === $request->getScheme()) && (!isset(
41-
$uri['host']
42-
) || $uri['host'] === $request->getHttpHost()) && (!isset(
43-
$uri['path']
44-
) || strpos(
45-
$requestUri,
46-
$uri['path']
47-
) !== false);
37+
$isValidSchema = !isset($uri['scheme']) || $uri['scheme'] === $request->getScheme();
38+
$isValidHost = !isset($uri['host']) || $uri['host'] === $request->getHttpHost();
39+
$isValidPath = !isset($uri['path']) || strpos($requestUri, $uri['path']) !== false;
40+
return $isValidSchema && $isValidHost && $isValidPath;
4841
}
4942

5043
/**

app/code/Magento/UrlRewrite/Controller/Router.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ protected function redirect($request, $url, $code)
127127
protected function getRewrite($requestPath, $storeId)
128128
{
129129
return $this->urlFinder->findOneByData([
130-
UrlRewrite::REQUEST_PATH => trim($requestPath, '/'),
130+
UrlRewrite::REQUEST_PATH => ltrim($requestPath, '/'),
131131
UrlRewrite::STORE_ID => $storeId,
132132
]);
133133
}

app/code/Magento/UrlRewrite/Model/Storage/AbstractStorage.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ protected function createUrlRewrite($data)
109109
$this->dataObjectHelper->populateWithArray(
110110
$dataObject,
111111
$data,
112-
'\Magento\UrlRewrite\Service\V1\Data\UrlRewrite'
112+
\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class
113113
);
114114
return $dataObject;
115115
}

app/code/Magento/UrlRewrite/Model/Storage/DbStorage.php

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
*/
66
namespace Magento\UrlRewrite\Model\Storage;
77

8+
use Magento\Framework\Api\DataObjectHelper;
89
use Magento\Framework\App\ResourceConnection;
10+
use Magento\UrlRewrite\Model\OptionProvider;
911
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
1012
use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
11-
use Magento\Framework\Api\DataObjectHelper;
1213

1314
class DbStorage extends AbstractStorage
1415
{
@@ -78,6 +79,54 @@ protected function doFindAllByData($data)
7879
*/
7980
protected function doFindOneByData($data)
8081
{
82+
if (is_array($data)
83+
&& array_key_exists(UrlRewrite::REQUEST_PATH, $data)
84+
&& is_string($data[UrlRewrite::REQUEST_PATH])
85+
) {
86+
$result = null;
87+
88+
$requestPath = $data[UrlRewrite::REQUEST_PATH];
89+
90+
$data[UrlRewrite::REQUEST_PATH] = [
91+
rtrim($requestPath, '/'),
92+
rtrim($requestPath, '/') . '/',
93+
];
94+
95+
$resultsFromDb = $this->connection->fetchAll($this->prepareSelect($data));
96+
97+
if (count($resultsFromDb) === 1) {
98+
$resultFromDb = current($resultsFromDb);
99+
$redirectTypes = [OptionProvider::TEMPORARY, OptionProvider::PERMANENT];
100+
101+
// If request path matches the DB value or it's redirect - we can return result from DB
102+
$canReturnResultFromDb = ($resultFromDb[UrlRewrite::REQUEST_PATH] === $requestPath
103+
|| in_array((int)$resultFromDb[UrlRewrite::REDIRECT_TYPE], $redirectTypes, true));
104+
105+
// Otherwise return 301 redirect to request path from DB results
106+
$result = $canReturnResultFromDb ? $resultFromDb : [
107+
UrlRewrite::ENTITY_TYPE => 'custom',
108+
UrlRewrite::ENTITY_ID => '0',
109+
UrlRewrite::REQUEST_PATH => $requestPath,
110+
UrlRewrite::TARGET_PATH => $resultFromDb[UrlRewrite::REQUEST_PATH],
111+
UrlRewrite::REDIRECT_TYPE => OptionProvider::PERMANENT,
112+
UrlRewrite::STORE_ID => $resultFromDb[UrlRewrite::STORE_ID],
113+
UrlRewrite::DESCRIPTION => null,
114+
UrlRewrite::IS_AUTOGENERATED => '0',
115+
UrlRewrite::METADATA => null,
116+
];
117+
} else {
118+
// If we have 2 results - return the row that matches request path
119+
foreach ($resultsFromDb as $resultFromDb) {
120+
if ($resultFromDb[UrlRewrite::REQUEST_PATH] === $requestPath) {
121+
$result = $resultFromDb;
122+
break;
123+
}
124+
}
125+
}
126+
127+
return $result;
128+
}
129+
81130
return $this->connection->fetchRow($this->prepareSelect($data));
82131
}
83132

app/code/Magento/UrlRewrite/Test/Unit/Model/Storage/AbstractStorageTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public function testFindAllByData()
5353

5454
$this->dataObjectHelper->expects($this->at(0))
5555
->method('populateWithArray')
56-
->with($urlRewrites[0], $rows[0], '\Magento\UrlRewrite\Service\V1\Data\UrlRewrite')
56+
->with($urlRewrites[0], $rows[0], \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
5757
->will($this->returnSelf());
5858

5959
$this->urlRewriteFactory->expects($this->at(0))
@@ -62,7 +62,7 @@ public function testFindAllByData()
6262

6363
$this->dataObjectHelper->expects($this->at(1))
6464
->method('populateWithArray')
65-
->with($urlRewrites[1], $rows[1], '\Magento\UrlRewrite\Service\V1\Data\UrlRewrite')
65+
->with($urlRewrites[1], $rows[1], \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
6666
->will($this->returnSelf());
6767

6868
$this->urlRewriteFactory->expects($this->at(1))
@@ -97,7 +97,7 @@ public function testFindOneByDataIfFound()
9797

9898
$this->dataObjectHelper->expects($this->once())
9999
->method('populateWithArray')
100-
->with($urlRewrite, $row, '\Magento\UrlRewrite\Service\V1\Data\UrlRewrite')
100+
->with($urlRewrite, $row, \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
101101
->will($this->returnSelf());
102102

103103
$this->urlRewriteFactory->expects($this->any())

0 commit comments

Comments
 (0)