Skip to content

Commit 04ea069

Browse files
authored
Fixed routing issues with multisite and multilanguage (Grav 1.5 edition) (#2046)
* Fixed routing issues with multisite and multilanguage (#1501)
1 parent 280d540 commit 04ea069

File tree

7 files changed

+113
-111
lines changed

7 files changed

+113
-111
lines changed

system/src/Grav/Common/Grav.php

+2-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
namespace Grav\Common;
1010

1111
use Grav\Common\Config\Config;
12-
use Grav\Common\Language\Language;
1312
use Grav\Common\Page\Medium\ImageMedium;
1413
use Grav\Common\Page\Medium\Medium;
1514
use Grav\Common\Page\Page;
@@ -205,11 +204,8 @@ public function redirect($route, $code = null)
205204
*/
206205
public function redirectLangSafe($route, $code = null)
207206
{
208-
/** @var Language $language */
209-
$language = $this['language'];
210-
211-
if (!$this['uri']->isExternal($route) && $language->enabled() && $language->isIncludeDefaultLanguage()) {
212-
$this->redirect($language->getLanguage() . $route, $code);
207+
if (!$this['uri']->isExternal($route)) {
208+
$this->redirect($this['pages']->route($route), $code);
213209
} else {
214210
$this->redirect($route, $code);
215211
}

system/src/Grav/Common/Page/Page.php

+17-28
Original file line numberDiff line numberDiff line change
@@ -1647,14 +1647,19 @@ public function canonical($include_lang = true)
16471647
* Gets the url for the Page.
16481648
*
16491649
* @param bool $include_host Defaults false, but true would include http://yourhost.com
1650-
* @param bool $canonical true to return the canonical URL
1651-
* @param bool $include_lang
1650+
* @param bool $canonical True to return the canonical URL
1651+
* @param bool $include_base Include base url on multisite as well as language code
16521652
* @param bool $raw_route
16531653
*
16541654
* @return string The url.
16551655
*/
1656-
public function url($include_host = false, $canonical = false, $include_lang = true, $raw_route = false)
1656+
public function url($include_host = false, $canonical = false, $include_base = true, $raw_route = false)
16571657
{
1658+
// Override any URL when external_url is set
1659+
if (isset($this->external_url)) {
1660+
return $this->external_url;
1661+
}
1662+
16581663
$grav = Grav::instance();
16591664

16601665
/** @var Pages $pages */
@@ -1663,41 +1668,25 @@ public function url($include_host = false, $canonical = false, $include_lang = t
16631668
/** @var Config $config */
16641669
$config = $grav['config'];
16651670

1666-
/** @var Language $language */
1667-
$language = $grav['language'];
1668-
1669-
/** @var Uri $uri */
1670-
$uri = $grav['uri'];
1671-
1672-
// Override any URL when external_url is set
1673-
if (isset($this->external_url)) {
1674-
return $this->external_url;
1675-
}
1676-
1677-
// get pre-route
1678-
if ($include_lang && $language->enabled()) {
1679-
$pre_route = $language->getLanguageURLPrefix();
1680-
} else {
1681-
$pre_route = '';
1682-
}
1671+
// get base route (multisite base and language)
1672+
$route = $include_base ? $pages->baseRoute() : '';
16831673

16841674
// add full route if configured to do so
1685-
if ($config->get('system.absolute_urls', false)) {
1675+
if (!$include_host && $config->get('system.absolute_urls', false)) {
16861676
$include_host = true;
16871677
}
16881678

1689-
// get canonical route if requested
16901679
if ($canonical) {
1691-
$route = $pre_route . $this->routeCanonical();
1680+
$route .= $this->routeCanonical();
16921681
} elseif ($raw_route) {
1693-
$route = $pre_route . $this->rawRoute();
1682+
$route .= $this->rawRoute();
16941683
} else {
1695-
$route = $pre_route . $this->route();
1684+
$route .= $this->route();
16961685
}
16971686

1698-
$rootUrl = $uri->rootUrl($include_host) . $pages->base();
1699-
1700-
$url = $rootUrl . '/' . trim($route, '/') . $this->urlExtension();
1687+
/** @var Uri $uri */
1688+
$uri = $grav['uri'];
1689+
$url = $uri->rootUrl($include_host) . '/' . trim($route, '/') . $this->urlExtension();
17011690

17021691
// trim trailing / if not root
17031692
if ($url !== '/') {

system/src/Grav/Common/Page/Pages.php

+46-24
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class Pages
4949
/**
5050
* @var array|string[]
5151
*/
52-
protected $baseUrl = [];
52+
protected $baseRoute = [];
5353

5454
/**
5555
* @var array|string[]
@@ -120,47 +120,69 @@ public function base($path = null)
120120
if ($path !== null) {
121121
$path = trim($path, '/');
122122
$this->base = $path ? '/' . $path : null;
123-
$this->baseUrl = [];
123+
$this->baseRoute = [];
124124
}
125125

126126
return $this->base;
127127
}
128128

129129
/**
130130
*
131-
* Get base URL for Grav pages.
131+
* Get base route for Grav pages.
132132
*
133-
* @param string $lang Optional language code for multilingual links.
134-
* @param bool $absolute If true, return absolute url, if false, return relative url. Otherwise return default.
133+
* @param string $lang Optional language code for multilingual routes.
135134
*
136135
* @return string
137136
*/
138-
public function baseUrl($lang = null, $absolute = null)
137+
public function baseRoute($lang = null)
139138
{
140-
$lang = (string) $lang;
141-
$type = $absolute === null ? 'base_url' : ($absolute ? 'base_url_absolute' : 'base_url_relative');
142-
$key = "{$lang} {$type}";
143-
144-
if (!isset($this->baseUrl[$key])) {
145-
/** @var Config $config */
146-
$config = $this->grav['config'];
139+
$key = $lang ?: 'default';
147140

141+
if (!isset($this->baseRoute[$key])) {
148142
/** @var Language $language */
149143
$language = $this->grav['language'];
150144

151-
if (!$lang) {
152-
$lang = $language->getActive();
153-
}
145+
$path_base = rtrim($this->base(), '/');
146+
$path_lang = $language->enabled() ? $language->getLanguageURLPrefix($lang) : '';
154147

155-
$path_append = rtrim($this->grav['pages']->base(), '/');
156-
if ($language->getDefault() !== $lang || $config->get('system.languages.include_default_lang') === true) {
157-
$path_append .= $lang ? '/' . $lang : '';
158-
}
148+
$this->baseRoute[$key] = $path_base . $path_lang;
149+
}
150+
151+
return $this->baseRoute[$key];
152+
}
159153

160-
$this->baseUrl[$key] = $this->grav[$type] . $path_append;
154+
/**
155+
*
156+
* Get route for Grav site.
157+
*
158+
* @param string $route Optional route to the page.
159+
* @param string $lang Optional language code for multilingual links.
160+
*
161+
* @return string
162+
*/
163+
public function route($route = '/', $lang = null)
164+
{
165+
if (!$route || $route === '/') {
166+
return $this->baseRoute($lang) ?: '/';
161167
}
162168

163-
return $this->baseUrl[$key];
169+
return $this->baseRoute($lang) . $route;
170+
}
171+
172+
/**
173+
*
174+
* Get base URL for Grav pages.
175+
*
176+
* @param string $lang Optional language code for multilingual links.
177+
* @param bool|null $absolute If true, return absolute url, if false, return relative url. Otherwise return default.
178+
*
179+
* @return string
180+
*/
181+
public function baseUrl($lang = null, $absolute = null)
182+
{
183+
$type = $absolute === null ? 'base_url' : ($absolute ? 'base_url_absolute' : 'base_url_relative');
184+
185+
return $this->grav[$type] . $this->baseRoute($lang);
164186
}
165187

166188
/**
@@ -179,7 +201,7 @@ public function homeUrl($lang = null, $absolute = null)
179201

180202
/**
181203
*
182-
* Get home URL for Grav site.
204+
* Get URL for Grav site.
183205
*
184206
* @param string $route Optional route to the page.
185207
* @param string $lang Optional language code for multilingual links.
@@ -189,7 +211,7 @@ public function homeUrl($lang = null, $absolute = null)
189211
*/
190212
public function url($route = '/', $lang = null, $absolute = null)
191213
{
192-
if ($route === '/') {
214+
if (!$route || $route === '/') {
193215
return $this->homeUrl($lang, $absolute);
194216
}
195217

system/src/Grav/Common/Processors/InitializeProcessor.php

+20-9
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,47 @@
88

99
namespace Grav\Common\Processors;
1010

11+
use Grav\Common\Config\Config;
12+
use Grav\Common\Uri;
13+
use Grav\Common\Utils;
14+
1115
class InitializeProcessor extends ProcessorBase implements ProcessorInterface
1216
{
1317
public $id = 'init';
1418
public $title = 'Initialize';
1519

1620
public function process()
1721
{
18-
$this->container['config']->debug();
22+
/** @var Config $config */
23+
$config = $this->container['config'];
24+
$config->debug();
1925

2026
// Use output buffering to prevent headers from being sent too early.
2127
ob_start();
22-
if ($this->container['config']->get('system.cache.gzip')) {
28+
if ($config->get('system.cache.gzip') && !@ob_start('ob_gzhandler')) {
2329
// Enable zip/deflate with a fallback in case of if browser does not support compressing.
24-
if (!@ob_start("ob_gzhandler")) {
25-
ob_start();
26-
}
30+
ob_start();
2731
}
2832

2933
// Initialize the timezone.
30-
if ($this->container['config']->get('system.timezone')) {
34+
if ($config->get('system.timezone')) {
3135
date_default_timezone_set($this->container['config']->get('system.timezone'));
3236
}
3337

3438
// FIXME: Initialize session should happen later after plugins have been loaded. This is a workaround to fix session issues in AWS.
35-
if ($this->container['config']->get('system.session.initialize', 1) && isset($this->container['session'])) {
39+
if (isset($this->container['session']) && $config->get('system.session.initialize', true)) {
3640
$this->container['session']->init();
3741
}
3842

39-
// Initialize uri.
40-
$this->container['uri']->init();
43+
/** @var Uri $uri */
44+
$uri = $this->container['uri'];
45+
$uri->init();
46+
47+
// Redirect pages with trailing slash if configured to do so.
48+
$path = $uri->path() ?: '/';
49+
if ($path !== '/' && $config->get('system.pages.redirect_trailing_slash', false) && Utils::endsWith($path, '/')) {
50+
$this->container->redirect(rtrim($path, '/'), 302);
51+
}
4152

4253
$this->container->setLocale();
4354
}

system/src/Grav/Common/Service/PageServiceProvider.php

+17-20
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace Grav\Common\Service;
1010

11+
use Grav\Common\Config\Config;
1112
use Grav\Common\Grav;
1213
use Grav\Common\Language\Language;
1314
use Grav\Common\Page\Page;
@@ -26,35 +27,33 @@ public function register(Container $container)
2627
/** @var Pages $pages */
2728
$pages = $c['pages'];
2829

30+
/** @var Config $config */
31+
$config = $c['config'];
32+
2933
/** @var Uri $uri */
3034
$uri = $c['uri'];
3135

32-
$path = $uri->path(); // Don't trim to support trailing slash default routes
33-
$path = $path ?: '/';
34-
36+
$path = $uri->path() ?: '/'; // Don't trim to support trailing slash default routes
3537
$page = $pages->dispatch($path);
3638

3739
// Redirection tests
3840
if ($page) {
39-
/** @var Language $language */
40-
$language = $c['language'];
41-
4241
// some debugger override logic
4342
if ($page->debugger() === false) {
4443
$c['debugger']->enabled(false);
4544
}
4645

47-
if ($c['config']->get('system.force_ssl')) {
48-
if (!isset($_SERVER['HTTPS']) || $_SERVER["HTTPS"] != "on") {
49-
$url = "https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
46+
if ($config->get('system.force_ssl')) {
47+
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
48+
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
5049
$c->redirect($url);
5150
}
5251
}
5352

54-
$url = $page->route();
53+
$url = $pages->route($page->route());
5554

5655
if ($uri->params()) {
57-
if ($url == '/') { //Avoid double slash
56+
if ($url === '/') { //Avoid double slash
5857
$url = $uri->params();
5958
} else {
6059
$url .= $uri->params();
@@ -67,18 +66,16 @@ public function register(Container $container)
6766
$url .= '#' . $uri->fragment();
6867
}
6968

69+
/** @var Language $language */
70+
$language = $c['language'];
71+
7072
// Language-specific redirection scenarios
71-
if ($language->enabled()) {
72-
if ($language->isLanguageInUrl() && !$language->isIncludeDefaultLanguage()) {
73-
$c->redirect($url);
74-
}
75-
if (!$language->isLanguageInUrl() && $language->isIncludeDefaultLanguage()) {
76-
$c->redirectLangSafe($url);
77-
}
73+
if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) {
74+
$c->redirect($url);
7875
}
7976
// Default route test and redirect
80-
if ($c['config']->get('system.pages.redirect_default_route') && $page->route() != $path) {
81-
$c->redirectLangSafe($url);
77+
if ($config->get('system.pages.redirect_default_route') && $page->route() !== $path) {
78+
$c->redirect($url);
8279
}
8380
}
8481

system/src/Grav/Common/Twig/TwigExtension.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ public function dump(\Twig_Environment $env, $context)
748748
* Output a Gist
749749
*
750750
* @param string $id
751-
* @param string $file
751+
* @param string|bool $file
752752
*
753753
* @return string
754754
*/
@@ -976,7 +976,7 @@ public function regexFilter($array, $regex, $flags = 0) {
976976
public function redirectFunc($url, $statusCode = 303)
977977
{
978978
header('Location: ' . $url, true, $statusCode);
979-
die();
979+
exit();
980980
}
981981

982982
/**

0 commit comments

Comments
 (0)