diff --git a/config/autoload/redirects.global.php b/config/autoload/redirects.global.php index 14aa684a..90137aa8 100644 --- a/config/autoload/redirects.global.php +++ b/config/autoload/redirects.global.php @@ -6,7 +6,7 @@ return [ 'not_found_redirects' => [ 'invalid_short_url' => null, // Formerly url_shortener.not_found_short_url.redirect_to - '404' => null, + 'regular_404' => null, 'base_url' => null, ], diff --git a/docker/README.md b/docker/README.md index 3855a524..7d7a384a 100644 --- a/docker/README.md +++ b/docker/README.md @@ -102,7 +102,7 @@ This is the complete list of supported env vars: * `DELETE_SHORT_URL_THRESHOLD`: The amount of visits on short URLs which will not allow them to be deleted. Defaults to `15`. * `VALIDATE_URLS`: Boolean which tells if shlink should validate a status 20x (after following redirects) is returned when trying to shorten a URL. Defaults to `true`. * `INVALID_SHORT_URL_REDIRECT_TO`: If a URL is provided here, when a user tries to access an invalid short URL, he/she will be redirected to this value. If this env var is not provided, the user will see a generic `404 - not found` page. -* `404_REDIRECT_TO`: If a URL is provided here, when a user tries to access a URL not matching any one supported by the router, he/she will be redirected to this value. If this env var is not provided, the user will see a generic `404 - not found` page. +* `REGULAR_404_REDIRECT_TO`: If a URL is provided here, when a user tries to access a URL not matching any one supported by the router, he/she will be redirected to this value. If this env var is not provided, the user will see a generic `404 - not found` page. * `BASE_URL_REDIRECT_TO`: If a URL is provided here, when a user tries to access Shlink's base URL, he/she will be redirected to this value. If this env var is not provided, the user will see a generic `404 - not found` page. * `BASE_PATH`: The base path from which you plan to serve shlink, in case you don't want to serve it from the root of the domain. Defaults to `''`. * `REDIS_SERVERS`: A comma-separated list of redis servers where Shlink locks are stored (locks are used to prevent some operations to be run more than once in parallel). @@ -155,7 +155,7 @@ The whole configuration should have this format, but it can be split into multip "short_domain_host": "doma.in", "validate_url": false, "invalid_short_url_redirect_to": "https://my-landing-page.com", - "404_redirect_to": "https://my-landing-page.com", + "regular_404_redirect_to": "https://my-landing-page.com", "base_url_redirect_to": "https://my-landing-page.com", "redis_servers": [ "tcp://172.20.0.1:6379", @@ -174,7 +174,7 @@ The whole configuration should have this format, but it can be split into multip ``` > This is internally parsed to how shlink expects the config. If you are using a version previous to 1.17.0, this parser is not present and you need to provide a config structure like the one [documented previously](https://github.com/shlinkio/shlink-docker-image/tree/v1.16.3#provide-config-via-volumes). -> The `not_found_redirect_to` option has been deprecated when `404_redirect_to` and `base_url_redirect_to` have been introduced. Use `invalid_short_url_redirect_to` instead (however, it will still work for backwards compatibility). +> The `not_found_redirect_to` option has been deprecated when `regular_404_redirect_to` and `base_url_redirect_to` have been introduced. Use `invalid_short_url_redirect_to` instead (however, it will still work for backwards compatibility). Once created just run shlink with the volume: diff --git a/docker/config/shlink_in_docker.local.php b/docker/config/shlink_in_docker.local.php index a90d775b..299a7c8e 100644 --- a/docker/config/shlink_in_docker.local.php +++ b/docker/config/shlink_in_docker.local.php @@ -95,7 +95,7 @@ $helper = new class { { return [ 'invalid_short_url' => env('INVALID_SHORT_URL_REDIRECT_TO', env('NOT_FOUND_REDIRECT_TO')), - '404' => env('404_REDIRECT_TO'), + 'regular_404' => env('REGULAR_404_REDIRECT_TO'), 'base_url' => env('BASE_URL_REDIRECT_TO'), ]; } diff --git a/module/Core/config/dependencies.config.php b/module/Core/config/dependencies.config.php index 8ea3773c..df45336c 100644 --- a/module/Core/config/dependencies.config.php +++ b/module/Core/config/dependencies.config.php @@ -20,7 +20,7 @@ return [ Options\AppOptions::class => ConfigAbstractFactory::class, Options\DeleteShortUrlsOptions::class => ConfigAbstractFactory::class, - Options\NotFoundShortUrlOptions::class => ConfigAbstractFactory::class, + Options\NotFoundRedirectOptions::class => ConfigAbstractFactory::class, Options\UrlShortenerOptions::class => ConfigAbstractFactory::class, Service\UrlShortener::class => ConfigAbstractFactory::class, @@ -44,7 +44,7 @@ return [ Options\AppOptions::class => ['config.app_options'], Options\DeleteShortUrlsOptions::class => ['config.delete_short_urls'], - Options\NotFoundShortUrlOptions::class => ['config.url_shortener.not_found_short_url'], + Options\NotFoundRedirectOptions::class => ['config.not_found_redirects'], Options\UrlShortenerOptions::class => ['config.url_shortener'], Service\UrlShortener::class => ['httpClient', 'em', Options\UrlShortenerOptions::class], @@ -58,7 +58,7 @@ return [ Service\UrlShortener::class, Service\VisitsTracker::class, Options\AppOptions::class, - Options\NotFoundShortUrlOptions::class, + Options\NotFoundRedirectOptions::class, 'Logger_Shlink', ], Action\PixelAction::class => [ diff --git a/module/Core/src/Action/RedirectAction.php b/module/Core/src/Action/RedirectAction.php index 4f91b63f..a7950fe6 100644 --- a/module/Core/src/Action/RedirectAction.php +++ b/module/Core/src/Action/RedirectAction.php @@ -18,18 +18,18 @@ class RedirectAction extends AbstractTrackingAction { use ErrorResponseBuilderTrait; - /** @var Options\NotFoundShortUrlOptions */ - private $notFoundOptions; + /** @var Options\NotFoundRedirectOptions */ + private $redirectOptions; public function __construct( UrlShortenerInterface $urlShortener, VisitsTrackerInterface $visitTracker, Options\AppOptions $appOptions, - Options\NotFoundShortUrlOptions $notFoundOptions, + Options\NotFoundRedirectOptions $redirectOptions, ?LoggerInterface $logger = null ) { parent::__construct($urlShortener, $visitTracker, $appOptions, $logger); - $this->notFoundOptions = $notFoundOptions; + $this->redirectOptions = $redirectOptions; } protected function createSuccessResp(string $longUrl): Response @@ -43,8 +43,8 @@ class RedirectAction extends AbstractTrackingAction ServerRequestInterface $request, RequestHandlerInterface $handler ): Response { - if ($this->notFoundOptions->isRedirectionEnabled()) { - return new RedirectResponse($this->notFoundOptions->getRedirectTo()); + if ($this->redirectOptions->hasInvalidShortUrlRedirect()) { + return new RedirectResponse($this->redirectOptions->getInvalidShortUrlRedirect()); } return $this->buildErrorResponse($request, $handler); diff --git a/module/Core/src/Config/SimplifiedConfigParser.php b/module/Core/src/Config/SimplifiedConfigParser.php index e85549a1..c8de3b4f 100644 --- a/module/Core/src/Config/SimplifiedConfigParser.php +++ b/module/Core/src/Config/SimplifiedConfigParser.php @@ -24,7 +24,7 @@ class SimplifiedConfigParser 'validate_url' => ['url_shortener', 'validate_url'], 'not_found_redirect_to' => ['not_found_redirects', 'invalid_short_url'], // Deprecated 'invalid_short_url_redirect_to' => ['not_found_redirects', 'invalid_short_url'], - '404_redirect_to' => ['not_found_redirects', '404'], + 'regular_404_redirect_to' => ['not_found_redirects', 'regular_404'], 'base_url_redirect_to' => ['not_found_redirects', 'base_path'], 'db_config' => ['entity_manager', 'connection'], 'delete_short_url_threshold' => ['delete_short_urls', 'visits_threshold'], diff --git a/module/Core/src/Options/NotFoundRedirectOptions.php b/module/Core/src/Options/NotFoundRedirectOptions.php new file mode 100644 index 00000000..0165f8fc --- /dev/null +++ b/module/Core/src/Options/NotFoundRedirectOptions.php @@ -0,0 +1,65 @@ +invalidShortUrl; + } + + public function hasInvalidShortUrlRedirect(): bool + { + return $this->invalidShortUrl !== null; + } + + protected function setInvalidShortUrl(?string $invalidShortUrl): self + { + $this->invalidShortUrl = $invalidShortUrl; + return $this; + } + + public function getRegular404Redirect(): ?string + { + return $this->regular404; + } + + public function hasRegular404Redirect(): bool + { + return $this->regular404 !== null; + } + + protected function setRegular404(?string $regular404): self + { + $this->regular404 = $regular404; + return $this; + } + + public function getBaseUrlRedirect(): ?string + { + return $this->baseUrl; + } + + public function hasBaseUrlRedirect(): bool + { + return $this->baseUrl !== null; + } + + protected function setBaseUrl(?string $baseUrl): self + { + $this->baseUrl = $baseUrl; + return $this; + } +} diff --git a/module/Core/src/Options/NotFoundShortUrlOptions.php b/module/Core/src/Options/NotFoundShortUrlOptions.php deleted file mode 100644 index 92c19e69..00000000 --- a/module/Core/src/Options/NotFoundShortUrlOptions.php +++ /dev/null @@ -1,37 +0,0 @@ -enableRedirection; - } - - protected function setEnableRedirection(bool $enableRedirection = true): self - { - $this->enableRedirection = $enableRedirection; - return $this; - } - - public function getRedirectTo(): string - { - return $this->redirectTo ?? ''; - } - - protected function setRedirectTo(?string $redirectTo): self - { - $this->redirectTo = $redirectTo; - return $this; - } -} diff --git a/module/Core/test/Action/RedirectActionTest.php b/module/Core/test/Action/RedirectActionTest.php index bd894f63..af28b1aa 100644 --- a/module/Core/test/Action/RedirectActionTest.php +++ b/module/Core/test/Action/RedirectActionTest.php @@ -25,20 +25,20 @@ class RedirectActionTest extends TestCase private $urlShortener; /** @var ObjectProphecy */ private $visitTracker; - /** @var Options\NotFoundShortUrlOptions */ - private $notFoundOptions; + /** @var Options\NotFoundRedirectOptions */ + private $redirectOptions; public function setUp(): void { $this->urlShortener = $this->prophesize(UrlShortener::class); $this->visitTracker = $this->prophesize(VisitsTracker::class); - $this->notFoundOptions = new Options\NotFoundShortUrlOptions(); + $this->redirectOptions = new Options\NotFoundRedirectOptions(); $this->action = new RedirectAction( $this->urlShortener->reveal(), $this->visitTracker->reveal(), new Options\AppOptions(['disableTrackParam' => 'foobar']), - $this->notFoundOptions + $this->redirectOptions ); } @@ -89,8 +89,7 @@ class RedirectActionTest extends TestCase $handler = $this->prophesize(RequestHandlerInterface::class); $handle = $handler->handle(Argument::any())->willReturn(new Response()); - $this->notFoundOptions->enableRedirection = true; - $this->notFoundOptions->redirectTo = 'https://shlink.io'; + $this->redirectOptions->invalidShortUrl = 'https://shlink.io'; $request = (new ServerRequest())->withAttribute('shortCode', $shortCode); $resp = $this->action->process($request, $handler->reveal());