From ec661d2c159c205b226aa076dcf149da507b41d7 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 11 Mar 2021 16:19:57 +0200 Subject: [PATCH] Fixed `page.html` returning duplicated content with `system.pages.redirect_default_route` turned on [#3130] --- CHANGELOG.md | 2 + system/blueprints/config/system.yaml | 49 ++++++++++-------- system/config/system.yaml | 6 +-- .../Page/Interfaces/PageRoutableInterface.php | 2 +- system/src/Grav/Common/Page/Page.php | 2 +- .../Common/Processors/InitializeProcessor.php | 9 ++-- .../Common/Service/PagesServiceProvider.php | 51 +++++++++++-------- 7 files changed, 70 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c273ad44..712ba70fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * Optimized `Flex Pages` for speed * Optimized saving visible/ordered pages when there are a lot of siblings [#3231](https://github.com/getgrav/grav/issues/3231) * Clearing cache now deletes all clockwork files + * Improved `system.pages.redirect_default_route` and `system.pages.redirect_trailing_slash` configuration options to accept redirect code 1. [](#bugfix) * Fixed clockwork error when clearing cache * Fixed missing method `translated()` in `Flex Pages` @@ -19,6 +20,7 @@ * Fixed disappearing pages on save if `pages://` stream resolves to multiple folders where the preferred folder doesn't exist * Fixed Markdown image attribute `loading` [#3251](https://github.com/getgrav/grav/pull/3251) * Fixed `Uri::isValidExtension()` returning false positives + * Fixed `page.html` returning duplicated content with `system.pages.redirect_default_route` turned on [#3130](https://github.com/getgrav/grav/issues/3130) # v1.7.7 ## 02/23/2021 diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index 8d5ca4e91..8ada38dd2 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -177,39 +177,48 @@ form: label: PLUGIN_ADMIN.APPEND_URL_EXT help: PLUGIN_ADMIN.APPEND_URL_EXT_HELP - pages.redirect_default_route: - type: toggle - label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE - help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP - highlight: 0 - options: - 1: PLUGIN_ADMIN.YES - 0: PLUGIN_ADMIN.NO - validate: - type: bool - pages.redirect_default_code: type: select size: medium classes: fancy label: PLUGIN_ADMIN.REDIRECT_DEFAULT_CODE help: PLUGIN_ADMIN.REDIRECT_DEFAULT_CODE_HELP + default: 302 options: - 301: 301 - Permanent - 302: 302 - Found - 303: 303 - Other + 301: 301 - Moved permanently + 302: 302 - Moved temporarily + 303: 303 - See Other 304: 304 - Not Modified + pages.redirect_default_route: + type: select + size: medium + classes: fancy + label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE + help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP + default: 0 + options: + 0: No redirect + 1: Use default redirect code + 301: 301 - Moved permanently + 302: 302 - Moved temporarily + validate: + type: int + pages.redirect_trailing_slash: - type: toggle + type: select + size: medium + classes: fancy label: PLUGIN_ADMIN.REDIRECT_TRAILING_SLASH help: PLUGIN_ADMIN.REDIRECT_TRAILING_SLASH_HELP - highlight: 1 + default: 1 options: - 1: PLUGIN_ADMIN.YES - 0: PLUGIN_ADMIN.NO + 0: No redirect + 1: Use default redirect code + 301: 301 - Moved permanently + 302: 302 - Moved temporarily validate: - type: bool + type: int pages.ignore_hidden: type: toggle @@ -1005,7 +1014,7 @@ form: 0: PLUGIN_ADMIN.NO validate: type: bool - + assets.enable_asset_sri: type: toggle label: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS diff --git a/system/config/system.yaml b/system/config/system.yaml index 764c04886..ffb98f247 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -75,9 +75,9 @@ pages: last_modified: false # Set the last modified date header based on file modification timestamp etag: true # Set the etag header tag vary_accept_encoding: false # Add `Vary: Accept-Encoding` header - redirect_default_route: false # Automatically redirect to a page's default route - redirect_default_code: 302 # Default code to use for redirects - redirect_trailing_slash: true # Handle automatically or 302 redirect a trailing / URL + redirect_default_code: 302 # Default code to use for redirects: 301|302|303 + redirect_trailing_slash: 1 # Always redirect trailing slash with redirect code 0|1|301|302 (0: no redirect, 1: use default code) + redirect_default_route: 0 # Always redirect to page's default route using code 0|1|301|302, also removes .htm and .html extensions ignore_files: [.DS_Store] # Files to ignore in Pages ignore_folders: [.git, .idea] # Folders to ignore in Pages ignore_hidden: true # Ignore all Hidden files and folders diff --git a/system/src/Grav/Common/Page/Interfaces/PageRoutableInterface.php b/system/src/Grav/Common/Page/Interfaces/PageRoutableInterface.php index 8fc3c207c..29002660c 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageRoutableInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageRoutableInterface.php @@ -63,7 +63,7 @@ interface PageRoutableInterface * the parents route and the current Page's slug. * * @param string|null $var Set new default route. - * @return string The route for the Page. + * @return string|null The route for the Page. */ public function route($var = null); diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 9d037d244..baac905f4 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -1875,7 +1875,7 @@ class Page implements PageInterface * the parents route and the current Page's slug. * * @param string|null $var Set new default route. - * @return string The route for the Page. + * @return string|null The route for the Page. */ public function route($var = null) { diff --git a/system/src/Grav/Common/Processors/InitializeProcessor.php b/system/src/Grav/Common/Processors/InitializeProcessor.php index a6a606cc6..ea23fa880 100644 --- a/system/src/Grav/Common/Processors/InitializeProcessor.php +++ b/system/src/Grav/Common/Processors/InitializeProcessor.php @@ -105,8 +105,9 @@ class InitializeProcessor extends ProcessorBase $this->initializeUri($config); // Grav may return redirect response right away. - if ($config->get('system.pages.redirect_trailing_slash', false)) { - $response = $this->handleRedirectRequest($request); + $redirectCode = (int)$config->get('system.pages.redirect_trailing_slash', 1); + if ($redirectCode) { + $response = $this->handleRedirectRequest($request, $redirectCode > 300 ? $redirectCode : null); if ($response) { $this->stopTimer('_init'); @@ -413,7 +414,7 @@ class InitializeProcessor extends ProcessorBase $this->stopTimer('_init_uri'); } - protected function handleRedirectRequest(RequestInterface $request): ?ResponseInterface + protected function handleRedirectRequest(RequestInterface $request, int $code = null): ?ResponseInterface { if (!in_array($request->getMethod(), ['GET', 'HEAD'])) { return null; @@ -426,7 +427,7 @@ class InitializeProcessor extends ProcessorBase if ($path !== $root && $path !== $root . '/' && Utils::endsWith($path, '/')) { // Use permanent redirect for SEO reasons. - return $this->container->getRedirectResponse((string)$uri->withPath(rtrim($path, '/')), 301); + return $this->container->getRedirectResponse((string)$uri->withPath(rtrim($path, '/')), $code); } return null; diff --git a/system/src/Grav/Common/Service/PagesServiceProvider.php b/system/src/Grav/Common/Service/PagesServiceProvider.php index 4acf37088..c59a15c05 100644 --- a/system/src/Grav/Common/Service/PagesServiceProvider.php +++ b/system/src/Grav/Common/Service/PagesServiceProvider.php @@ -77,32 +77,39 @@ class PagesServiceProvider implements ServiceProviderInterface } } - $url = $pages->route($page->route()); + $route = $page->route(); + if ($route) { + $url = $pages->route($route); - if ($uri->params()) { - if ($url === '/') { //Avoid double slash - $url = $uri->params(); - } else { - $url .= $uri->params(); + if ($uri->params()) { + if ($url === '/') { //Avoid double slash + $url = $uri->params(); + } else { + $url .= $uri->params(); + } + } + if ($uri->query()) { + $url .= '?' . $uri->query(); + } + if ($uri->fragment()) { + $url .= '#' . $uri->fragment(); } - } - if ($uri->query()) { - $url .= '?' . $uri->query(); - } - if ($uri->fragment()) { - $url .= '#' . $uri->fragment(); - } - /** @var Language $language */ - $language = $grav['language']; + /** @var Language $language */ + $language = $grav['language']; - // Language-specific redirection scenarios - if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) { - $grav->redirect($url); - } - // Default route test and redirect - if ($config->get('system.pages.redirect_default_route') && $page->route() !== $path) { - $grav->redirect($url); + // Language-specific redirection scenarios + if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) { + $grav->redirect($url); + } + + // Default route test and redirect + $redirectCode = (int)$config->get('system.pages.redirect_default_route', 0); + if ($redirectCode && \in_array($uri->method(), ['GET', 'HEAD'], true)) { + if ($route !== $path || \in_array($uri->extension(), ['htm', 'html'], true)) { + $grav->redirect($url, $redirectCode > 300 ? $redirectCode : null); + } + } } }