Fixed page.html returning duplicated content with system.pages.redirect_default_route turned on [#3130]

This commit is contained in:
Matias Griese 2021-03-11 16:19:57 +02:00
parent 58533c495c
commit ec661d2c15
7 changed files with 70 additions and 51 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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)
{

View File

@ -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;

View File

@ -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);
}
}
}
}