Skip to content

Commit 0ecf635

Browse files
author
Oleksii Korshenko
committed
MAGETWO-70255: Fix trailing slash used in url rewrites #10043
- covered changes with integration tests
1 parent 9292f35 commit 0ecf635

File tree

3 files changed

+139
-11
lines changed

3 files changed

+139
-11
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
/**
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\UrlRewrite\Controller;
7+
8+
class UrlRewriteTest extends \Magento\TestFramework\TestCase\AbstractController
9+
{
10+
/**
11+
* @magentoDataFixture Magento/UrlRewrite/_files/url_rewrite.php
12+
* @magentoAppIsolation enabled
13+
*
14+
* @covers \Magento\UrlRewrite\Controller\Router::match
15+
* @covers \Magento\UrlRewrite\Model\Storage\DbStorage::doFindOneByData
16+
*
17+
* @param string $request
18+
* @param string $redirect
19+
*
20+
* @dataProvider requestDataProvider
21+
*/
22+
public function testMatchUrlRewrite($request, $redirect)
23+
{
24+
$this->dispatch($request);
25+
$code = $this->getResponse()->getHttpResponseCode();
26+
$location = $this->getResponse()->getHeader('Location')->getFieldValue();
27+
28+
$this->assertEquals(301, $code, 'Invalid response code');
29+
$this->assertStringEndsWith($redirect, $location, 'Invalid location header');
30+
}
31+
32+
public function requestDataProvider()
33+
{
34+
return [
35+
'Use Case #1: Rewrite: page-one/ --(301)--> page-a/; Request: page-one/ --(301)--> page-a/' => [
36+
'request' => '/page-one/',
37+
'redirect' => '/page-a/',
38+
],
39+
'Use Case #2: Rewrite: page-one/ --(301)--> page-a/; Request: page-one --(301)--> page-a/' => [
40+
'request' => '/page-one',
41+
'redirect' => '/page-a/',
42+
],
43+
'Use Case #3: Rewrite: page-two --(301)--> page-b; Request: page-two --(301)--> page-b' => [
44+
'request' => '/page-two',
45+
'redirect' => '/page-b',
46+
],
47+
'Use Case #4: Rewrite: page-two --(301)--> page-b; Request: page-two --(301)--> page-b' => [
48+
'request' => '/page-two/',
49+
'redirect' => '/page-b',
50+
],
51+
'Use Case #5: Rewrite: page-similar --(301)--> page-a; Request: page-similar --(301)--> page-a' => [
52+
'request' => '/page-similar',
53+
'redirect' => '/page-a',
54+
],
55+
'Use Case #6: Rewrite: page-similar/ --(301)--> page-b; Request: page-similar/ --(301)--> page-b' => [
56+
'request' => '/page-similar/',
57+
'redirect' => '/page-b',
58+
],
59+
];
60+
}
61+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use \Magento\UrlRewrite\Model\OptionProvider;
8+
use \Magento\UrlRewrite\Model\UrlRewrite;
9+
10+
/** @var UrlRewrite $rewrite */
11+
/** @var \Magento\Framework\ObjectManagerInterface $objectManager */
12+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
13+
/** @var \Magento\UrlRewrite\Model\ResourceModel\UrlRewrite $rewriteResource */
14+
$rewriteResource = $objectManager->create(\Magento\UrlRewrite\Model\ResourceModel\UrlRewrite::class);
15+
/** @var \Magento\Cms\Model\ResourceModel\Page $pageResource */
16+
$pageResource = $objectManager->create(\Magento\Cms\Model\ResourceModel\Page::class);
17+
18+
$storeID = 1;
19+
20+
/** @var $page \Magento\Cms\Model\Page */
21+
$page = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Cms\Model\Page::class);
22+
$page->setTitle('Cms Page A')
23+
->setIdentifier('page-a')
24+
->setStores([$storeID])
25+
->setIsActive(1)
26+
->setContent('<h1>Cms Page A</h1>')
27+
->setPageLayout('1column');
28+
$pageResource->save($page);
29+
30+
$page = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Cms\Model\Page::class);
31+
$page->setTitle('Cms B')
32+
->setIdentifier('page-b')
33+
->setStores([$storeID])
34+
->setIsActive(1)
35+
->setContent('<h1>Cms Page B</h1>')
36+
->setPageLayout('1column')
37+
->setCustomTheme('Magento/blank');
38+
$pageResource->save($page);
39+
40+
$rewrite = $objectManager->create(UrlRewrite::class);
41+
$rewrite->setEntityType('custom')
42+
->setRequestPath('page-one/')
43+
->setTargetPath('page-a/')
44+
->setRedirectType(OptionProvider::PERMANENT)
45+
->setStoreId($storeID)
46+
->setDescription('From page-one/ to page-a/');
47+
$rewriteResource->save($rewrite);
48+
49+
$rewrite = $objectManager->create(UrlRewrite::class);
50+
$rewrite->setEntityType('custom')
51+
->setRequestPath('page-two')
52+
->setTargetPath('page-b')
53+
->setRedirectType(OptionProvider::PERMANENT)
54+
->setStoreId($storeID)
55+
->setDescription('From page-two to page-b');
56+
$rewriteResource->save($rewrite);
57+
58+
$rewrite = $objectManager->create(UrlRewrite::class);
59+
$rewrite->setEntityType('custom')
60+
->setRequestPath('page-similar')
61+
->setTargetPath('page-a')
62+
->setRedirectType(OptionProvider::PERMANENT)
63+
->setStoreId($storeID)
64+
->setDescription('From age-similar without trailing slash to page-a');
65+
$rewriteResource->save($rewrite);
66+
67+
$rewrite = $objectManager->create(UrlRewrite::class);
68+
$rewrite->setEntityType('custom')
69+
->setRequestPath('page-similar/')
70+
->setTargetPath('page-b')
71+
->setRedirectType(OptionProvider::PERMANENT)
72+
->setStoreId($storeID)
73+
->setDescription('From age-similar with trailing slash to page-b');
74+
$rewriteResource->save($rewrite);

0 commit comments

Comments
 (0)