Skip to content

Commit f2aa57e

Browse files
🔃 [Magento Community Engineering] Community Contributions - 2.4-develop
Accepted Community Pull Requests: - #25603: Fix removing query string from url after redirect (by @arendarenko) Fixed GitHub Issues: - #18717: UrlRewrite removes query string from url, if url has trailing slash (reported by @sergeynezbritskiy) has been fixed in #25603 by @arendarenko in 2.4-develop branch Related commits: 1. 0693cc2 2. 19b7bda 3. f63475c 4. b1a2a29
2 parents 9d76e2b + 27b2158 commit f2aa57e

File tree

5 files changed

+162
-8
lines changed

5 files changed

+162
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ protected function processRedirect($request, $rewrite)
118118
if ($rewrite->getEntityType() !== Rewrite::ENTITY_TYPE_CUSTOM
119119
|| ($prefix = substr($target, 0, 6)) !== 'http:/' && $prefix !== 'https:'
120120
) {
121-
$target = $this->url->getUrl('', ['_direct' => $target]);
121+
$target = $this->url->getUrl('', ['_direct' => $target, '_query' => $request->getParams()]);
122122
}
123123
return $this->redirect($request, $target, $rewrite->getRedirectType());
124124
}

app/code/Magento/UrlRewrite/Test/Unit/Controller/RouterTest.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ public function testNoRewriteAfterStoreSwitcherWhenOldRewriteEqualsToNewOne()
260260
*/
261261
public function testMatchWithRedirect()
262262
{
263+
$queryParams = [];
263264
$this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store));
264265
$urlRewrite = $this->getMockBuilder(UrlRewrite::class)
265266
->disableOriginalConstructor()->getMock();
@@ -268,7 +269,11 @@ public function testMatchWithRedirect()
268269
$this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite));
269270
$this->response->expects($this->once())->method('setRedirect')
270271
->with('new-target-path', 'redirect-code');
271-
$this->url->expects($this->once())->method('getUrl')->with('', ['_direct' => 'target-path'])
272+
$this->request->expects($this->once())->method('getParams')->willReturn($queryParams);
273+
$this->url->expects($this->once())->method('getUrl')->with(
274+
'',
275+
['_direct' => 'target-path', '_query' => $queryParams]
276+
)
272277
->will($this->returnValue('new-target-path'));
273278
$this->request->expects($this->once())->method('setDispatched')->with(true);
274279
$this->actionFactory->expects($this->once())->method('create')
@@ -282,15 +287,20 @@ public function testMatchWithRedirect()
282287
*/
283288
public function testMatchWithCustomInternalRedirect()
284289
{
290+
$queryParams = [];
285291
$this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store));
286292
$urlRewrite = $this->getMockBuilder(UrlRewrite::class)
287293
->disableOriginalConstructor()->getMock();
288294
$urlRewrite->expects($this->any())->method('getEntityType')->will($this->returnValue('custom'));
289295
$urlRewrite->expects($this->any())->method('getRedirectType')->will($this->returnValue('redirect-code'));
290296
$urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue('target-path'));
291297
$this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite));
298+
$this->request->expects($this->any())->method('getParams')->willReturn($queryParams);
292299
$this->response->expects($this->once())->method('setRedirect')->with('a', 'redirect-code');
293-
$this->url->expects($this->once())->method('getUrl')->with('', ['_direct' => 'target-path'])->willReturn('a');
300+
$this->url->expects($this->once())->method('getUrl')->with(
301+
'',
302+
['_direct' => 'target-path', '_query' => $queryParams]
303+
)->willReturn('a');
294304
$this->request->expects($this->once())->method('setDispatched')->with(true);
295305
$this->actionFactory->expects($this->once())->method('create')
296306
->with(\Magento\Framework\App\Action\Redirect::class);
@@ -312,6 +322,7 @@ public function testMatchWithCustomExternalRedirect($targetPath)
312322
$urlRewrite->expects($this->any())->method('getTargetPath')->will($this->returnValue($targetPath));
313323
$this->urlFinder->expects($this->any())->method('findOneByData')->will($this->returnValue($urlRewrite));
314324
$this->response->expects($this->once())->method('setRedirect')->with($targetPath, 'redirect-code');
325+
$this->request->expects($this->never())->method('getParams');
315326
$this->url->expects($this->never())->method('getUrl');
316327
$this->request->expects($this->once())->method('setDispatched')->with(true);
317328
$this->actionFactory->expects($this->once())->method('create')

dev/tests/integration/testsuite/Magento/UrlRewrite/Controller/UrlRewriteTest.php

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ public function testMatchUrlRewrite(
4444
$location = $response->getHeader('Location')->getFieldValue();
4545
$this->assertStringEndsWith(
4646
$redirect,
47-
$location,
48-
'Invalid location header'
47+
$location
4948
);
5049
}
5150
}
@@ -80,6 +79,60 @@ public function requestDataProvider(): array
8079
'request' => '/page-similar/',
8180
'redirect' => '/page-b',
8281
],
82+
'Use Case #7: Rewrite: page-similar --(301)--> page-a; '
83+
. 'Request: page-similar?param=1 --(301)--> page-a?param=1' => [
84+
'request' => '/page-similar?param=1',
85+
'redirect' => '/page-a?param=1',
86+
],
87+
'Use Case #8: Rewrite: page-similar/ --(301)--> page-b; '
88+
. 'Request: page-similar/?param=1 --(301)--> page-b?param=1' => [
89+
'request' => '/page-similar/?param=1',
90+
'redirect' => '/page-b?param=1',
91+
],
92+
'Use Case #9: Rewrite: page-similar-query-param --(301)--> page-d?param1=1;'
93+
. 'Request: page-similar-query-param --(301)--> page-d?param1=1' => [
94+
'request' => '/page-similar-query-param',
95+
'redirect' => '/page-d?param1=1',
96+
],
97+
'Use Case #10: Rewrite: page-similar-query-param --(301)--> page-d?param1=1; '
98+
. 'Request: page-similar-query-param?param2=1 --(301)--> page-d?param1=1&param2=1' => [
99+
'request' => '/page-similar-query-param?param2=1',
100+
'redirect' => '/page-d?param1=1&param2=1',
101+
],
102+
'Use Case #11: Rewrite: page-similar-query-param/ --(301)--> page-e?param1=1; '
103+
. 'Request: page-similar-query-param/ --(301)--> page-e?param1=1' => [
104+
'request' => '/page-similar-query-param/',
105+
'redirect' => '/page-e?param1=1',
106+
],
107+
'Use Case #12: Rewrite: page-similar-query-param/ --(301)--> page-e?param1=1;'
108+
. 'Request: page-similar-query-param/?param2=1 --(301)--> page-e?param1=1&param2=1' => [
109+
'request' => '/page-similar-query-param/?param2=1',
110+
'redirect' => '/page-e?param1=1&param2=1',
111+
],
112+
'Use Case #13: Rewrite: page-external1 --(301)--> http://example.com/external;'
113+
. 'Request: page-external1?param1=1 --(301)--> http://example.com/external (not fills get params)' => [
114+
'request' => '/page-external1?param1=1',
115+
'redirect' => 'http://example.com/external',
116+
],
117+
'Use Case #14: Rewrite: page-external2/ --(301)--> https://example.com/external2/;'
118+
. 'Request: page-external2?param2=1 --(301)--> https://example.com/external2/ (not fills get params)' => [
119+
'request' => '/page-external2?param2=1',
120+
'redirect' => 'https://example.com/external2/',
121+
],
122+
'Use Case #15: Rewrite: page-external3 --(301)--> http://example.com/external?param1=value1;'
123+
. 'Request: page-external3?param1=custom1&param2=custom2 --(301)--> '
124+
. 'http://example.com/external?param1=value1'
125+
. ' (fills get param from target path)' => [
126+
'request' => '/page-external3?param1=custom1&param2=custom2',
127+
'redirect' => 'http://example.com/external?param1=value1',
128+
],
129+
'Use Case #16: Rewrite: page-external4/ --(301)--> https://example.com/external2/?param2=value2;'
130+
. 'Request: page-external4?param1=custom1&param2=custom2 --(301)--> '
131+
. 'https://example.com/external2/?param2=value2 '
132+
. ' (fills get param from target path)' => [
133+
'request' => '/page-external4?param1=custom1&param2=custom2',
134+
'redirect' => 'https://example.com/external2/?param2=value2',
135+
],
83136
];
84137
}
85138
}

dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite.php

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,26 @@
6464
->setStores([$storeID, $secondStoreId]);
6565
$pageResource->save($page);
6666

67+
$page = $objectManager->create(Page::class);
68+
$page->setTitle('Cms D')
69+
->setIdentifier('page-d')
70+
->setIsActive(1)
71+
->setContent('<h1>Cms Page D</h1>')
72+
->setPageLayout('1column')
73+
->setCustomTheme('Magento/blank')
74+
->setStores([$storeID, $secondStoreId]);
75+
$pageResource->save($page);
76+
77+
$page = $objectManager->create(Page::class);
78+
$page->setTitle('Cms E')
79+
->setIdentifier('page-e')
80+
->setIsActive(1)
81+
->setContent('<h1>Cms Page E</h1>')
82+
->setPageLayout('1column')
83+
->setCustomTheme('Magento/blank')
84+
->setStores([$storeID, $secondStoreId]);
85+
$pageResource->save($page);
86+
6787
$rewrite = $objectManager->create(UrlRewrite::class);
6888
$rewrite->setEntityType('custom')
6989
->setRequestPath('page-one/')
@@ -88,7 +108,7 @@
88108
->setTargetPath('page-a')
89109
->setRedirectType(OptionProvider::PERMANENT)
90110
->setStoreId($storeID)
91-
->setDescription('From age-similar without trailing slash to page-a');
111+
->setDescription('From page-similar without trailing slash to page-a');
92112
$rewriteResource->save($rewrite);
93113

94114
$rewrite = $objectManager->create(UrlRewrite::class);
@@ -97,7 +117,7 @@
97117
->setTargetPath('page-b')
98118
->setRedirectType(OptionProvider::PERMANENT)
99119
->setStoreId($storeID)
100-
->setDescription('From age-similar with trailing slash to page-b');
120+
->setDescription('From page-similar with trailing slash to page-b');
101121
$rewriteResource->save($rewrite);
102122

103123
//Emulating auto-generated aliases (like the ones used for categories).
@@ -117,3 +137,57 @@
117137
->setRedirectType(0)
118138
->setStoreId($secondStoreId);
119139
$rewriteResource->save($rewrite);
140+
141+
$rewrite = $objectManager->create(UrlRewrite::class);
142+
$rewrite->setEntityType('custom')
143+
->setRequestPath('page-similar-query-param')
144+
->setTargetPath('page-d?param1=1')
145+
->setRedirectType(OptionProvider::PERMANENT)
146+
->setStoreId($storeID)
147+
->setDescription('From page-similar-query-param to page-d with query param');
148+
$rewriteResource->save($rewrite);
149+
150+
$rewrite = $objectManager->create(UrlRewrite::class);
151+
$rewrite->setEntityType('custom')
152+
->setRequestPath('page-similar-query-param/')
153+
->setTargetPath('page-e?param1=1')
154+
->setRedirectType(OptionProvider::PERMANENT)
155+
->setStoreId($storeID)
156+
->setDescription('From page-similar-query-param with trailing slash to page-e with query param');
157+
$rewriteResource->save($rewrite);
158+
159+
$rewrite = $objectManager->create(UrlRewrite::class);
160+
$rewrite->setEntityType('custom')
161+
->setRequestPath('page-external1')
162+
->setTargetPath('http://example.com/external')
163+
->setRedirectType(OptionProvider::PERMANENT)
164+
->setStoreId($storeID)
165+
->setDescription('From page-external to external URL');
166+
$rewriteResource->save($rewrite);
167+
168+
$rewrite = $objectManager->create(UrlRewrite::class);
169+
$rewrite->setEntityType('custom')
170+
->setRequestPath('page-external2/')
171+
->setTargetPath('https://example.com/external2/')
172+
->setRedirectType(OptionProvider::PERMANENT)
173+
->setStoreId($storeID)
174+
->setDescription('From page-external with trailing slash to external URL');
175+
$rewriteResource->save($rewrite);
176+
177+
$rewrite = $objectManager->create(UrlRewrite::class);
178+
$rewrite->setEntityType('custom')
179+
->setRequestPath('page-external3')
180+
->setTargetPath('http://example.com/external?param1=value1')
181+
->setRedirectType(OptionProvider::PERMANENT)
182+
->setStoreId($storeID)
183+
->setDescription('From page-external to external URL');
184+
$rewriteResource->save($rewrite);
185+
186+
$rewrite = $objectManager->create(UrlRewrite::class);
187+
$rewrite->setEntityType('custom')
188+
->setRequestPath('page-external4/')
189+
->setTargetPath('https://example.com/external2/?param2=value2')
190+
->setRedirectType(OptionProvider::PERMANENT)
191+
->setStoreId($storeID)
192+
->setDescription('From page-external with trailing slash to external URL');
193+
$rewriteResource->save($rewrite);

dev/tests/integration/testsuite/Magento/UrlRewrite/_files/url_rewrite_rollback.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
$pageRepository->deleteById('page-a');
2020
$pageRepository->deleteById('page-b');
2121
$pageRepository->deleteById('page-c');
22+
$pageRepository->deleteById('page-d');
23+
$pageRepository->deleteById('page-e');
2224

2325
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
2426
$productRepository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
@@ -29,7 +31,21 @@
2931
->create(\Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollection::class);
3032
$collection = $urlRewriteCollection
3133
->addFieldToFilter('entity_type', 'custom')
32-
->addFieldToFilter('target_path', ['page-a/', 'page-a', 'page-b', 'page-c'])
34+
->addFieldToFilter(
35+
'target_path',
36+
[
37+
'page-a/',
38+
'page-a',
39+
'page-b',
40+
'page-c',
41+
'page-d?param1=1',
42+
'page-e?param1=1',
43+
'http://example.com/external',
44+
'https://example.com/external2/',
45+
'http://example.com/external?param1=value1',
46+
'https://example.com/external2/?param2=value2'
47+
]
48+
)
3349
->load()
3450
->walk('delete');
3551

0 commit comments

Comments
 (0)