PagesServiceProvider.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. /**
  3. * @package Grav\Common\Service
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Service;
  9. use Grav\Common\Config\Config;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Language\Language;
  12. use Grav\Common\Page\Page;
  13. use Grav\Common\Page\Pages;
  14. use Grav\Common\Uri;
  15. use Pimple\Container;
  16. use Pimple\ServiceProviderInterface;
  17. use SplFileInfo;
  18. use function defined;
  19. /**
  20. * Class PagesServiceProvider
  21. * @package Grav\Common\Service
  22. */
  23. class PagesServiceProvider implements ServiceProviderInterface
  24. {
  25. /**
  26. * @param Container $container
  27. * @return void
  28. */
  29. public function register(Container $container)
  30. {
  31. $container['pages'] = function (Grav $grav) {
  32. return new Pages($grav);
  33. };
  34. if (defined('GRAV_CLI')) {
  35. $container['page'] = static function (Grav $grav) {
  36. $path = $grav['locator']->findResource('system://pages/notfound.md');
  37. $page = new Page();
  38. $page->init(new SplFileInfo($path));
  39. $page->routable(false);
  40. return $page;
  41. };
  42. return;
  43. }
  44. $container['page'] = static function (Grav $grav) {
  45. /** @var Pages $pages */
  46. $pages = $grav['pages'];
  47. /** @var Config $config */
  48. $config = $grav['config'];
  49. /** @var Uri $uri */
  50. $uri = $grav['uri'];
  51. $path = $uri->path() ? urldecode($uri->path()) : '/'; // Don't trim to support trailing slash default routes
  52. $page = $pages->dispatch($path);
  53. // Redirection tests
  54. if ($page) {
  55. // some debugger override logic
  56. if ($page->debugger() === false) {
  57. $grav['debugger']->enabled(false);
  58. }
  59. if ($config->get('system.force_ssl')) {
  60. $scheme = $uri->scheme(true);
  61. if ($scheme !== 'https') {
  62. $url = 'https://' . $uri->host() . $uri->uri();
  63. $grav->redirect($url);
  64. }
  65. }
  66. $route = $page->route();
  67. if ($route && \in_array($uri->method(), ['GET', 'HEAD'], true)) {
  68. $pageExtension = $page->urlExtension();
  69. $url = $pages->route($route) . $pageExtension;
  70. if ($uri->params()) {
  71. if ($url === '/') { //Avoid double slash
  72. $url = $uri->params();
  73. } else {
  74. $url .= $uri->params();
  75. }
  76. }
  77. if ($uri->query()) {
  78. $url .= '?' . $uri->query();
  79. }
  80. if ($uri->fragment()) {
  81. $url .= '#' . $uri->fragment();
  82. }
  83. /** @var Language $language */
  84. $language = $grav['language'];
  85. $redirect_default_route = $page->header()->redirect_default_route ?? $config->get('system.pages.redirect_default_route', 0);
  86. $redirectCode = (int) $redirect_default_route;
  87. // Language-specific redirection scenarios
  88. if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) {
  89. $grav->redirect($url, $redirectCode);
  90. }
  91. // Default route test and redirect
  92. if ($redirectCode) {
  93. $uriExtension = $uri->extension();
  94. $uriExtension = null !== $uriExtension ? '.' . $uriExtension : '';
  95. if ($route !== $path || ($pageExtension !== $uriExtension
  96. && \in_array($pageExtension, ['', '.htm', '.html'], true)
  97. && \in_array($uriExtension, ['', '.htm', '.html'], true))) {
  98. $grav->redirect($url, $redirectCode);
  99. }
  100. }
  101. }
  102. }
  103. // if page is not found, try some fallback stuff
  104. if (!$page || !$page->routable()) {
  105. // Try fallback URL stuff...
  106. $page = $grav->fallbackUrl($path);
  107. if (!$page) {
  108. $path = $grav['locator']->findResource('system://pages/notfound.md');
  109. $page = new Page();
  110. $page->init(new SplFileInfo($path));
  111. $page->routable(false);
  112. }
  113. }
  114. return $page;
  115. };
  116. }
  117. }