shlink/CHANGELOG.md
2024-03-15 23:00:40 +01:00

122 KiB

CHANGELOG

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[4.0.3] - 2024-03-15

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #2058 Fix DB credentials provided as env vars being casted to int if they include only numbers.
  • #2060 Fix error when trying to redirect to a non-http long URL.

[4.0.2] - 2024-03-09

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #2021 Fix infinite GeoLite2 downloads.

[4.0.1] - 2024-03-08

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #2041 Document missing color and bgColor params for the QR code route in the OAS docs.
  • #2043 Fix language redirect conditions matching too low quality accepted languages.

[4.0.0] - 2024-03-03

Added

  • #1914 Add new dynamic redirects engine based on rules. Rules are conditions checked against the visitor's request, and when matching, they can result in a redirect to a different long URL.

    Rules can be based on things like the presence of specific params, headers, locations, etc. This version ships with three initial rule condition types: device, query param and language.

  • #1902 Add dynamic redirects based on query parameters.

    This is implemented on top of the new rule-based redirects.

  • #1915 Add dynamic redirects based on accept language.

    This is implemented on top of the new rule-based redirects.

  • #1868 Add support for docker compose secrets to the docker image.

  • #1979 Allow orphan visits lists to be filtered by type.

    This is supported both by the GET /visits/orphan API endpoint via type=... query param, and by the visit:orphan CLI command, via --type flag.

  • #1904 Allow to customize QR codes foreground color, background color and logo.

  • #1884 Allow a path prefix to be provided during short URL creation.

    This can be useful to let Shlink generate partially random URLs, but with a known prefix.

    Path prefixes are validated and filtered taking multi-segment slugs into consideration, which means slashes are replaced with dashes as long as multi-segment slugs are disabled.

Changed

  • #1935 Replace dependency on abandoned php-middleware/request-id with userland simple middleware.
  • #1988 Remove dependency on league\uri package.
  • #1909 Update docker image to PHP 8.3.
  • #1786 Run API tests with RoadRunner by default.
  • #2008 Update to Doctrine ORM 3.0.
  • #2010 Update to Symfony 7.0 components.
  • #2016 Simplify and improve how code coverage is generated in API and CLI tests.
  • #1674 Database columns persisting long URLs have now TEXT type, which allows for much longer values.

Deprecated

  • Nothing

Removed

  • #1908 Remove support for openswoole (and swoole).

Fixed

  • #2000 Fix short URL creation/edition getting stuck when trying to resolve the title of a long URL which never returns a response.

[3.7.3] - 2024-01-04

Added

  • Nothing

Changed

  • #1968 Move migrations from data to module/Core.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1967 Allow an empty dir to be mounted in data when using the docker image.

[3.7.2] - 2023-12-26

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1960 Allow QR codes to be optionally resolved even when corresponding short URL is not enabled.

[3.7.1] - 2023-12-17

Added

  • Nothing

Changed

  • Remove dependency on functional-php library
  • #1939 Fine-tune RoadRunner logs to avoid too many useless info.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1947 Fix error when importing short URLs while using Postgres.

[3.7.0] - 2023-11-25

Added

  • #1798 Experimental support to send visits to an external Matomo instance.

  • #1780 Add new NO_ORPHAN_VISITS API key role.

    Keys with this role will always get 0 when fetching orphan visits.

    When trying to delete orphan visits the result will also be 0 and no visits will actually get deleted.

  • #1879 Cache namespace can now be customized via config option or CACHE_NAMESPACE env var.

    This is important if you are running multiple Shlink instance on the same server, or they share the same Redis instance (even more so if they are on different versions).

  • #1905 Add support for PHP 8.3.

  • #1927 Allow redis credentials be URL-decoded before passing them to connection.

  • #1834 Add support for redis encrypted connections using SSL/TLS.

    Encryption should work out of the box if servers schema is set tp tls or rediss, including support for self-signed certificates.

    This has been tested with AWS ElasticCache using in-transit encryption, and with Digital Ocean Redis database.

  • #1906 Add support for RabbitMQ encrypted connections using SSL/TLS.

    In order to enable SLL, you need to pass RABBITMQ_USE_SSL=true or the corresponding config option.

    Connections using self-signed certificates should work out of the box.

    This has been tested with AWS RabbitMQ using in-transit encryption, and with CloudAMQP.

Changed

  • #1799 RoadRunner/openswoole jobs are not run anymore for tasks that are actually disabled.

    For example, if you did not enable RabbitMQ real-time updates, instead of triggering a job that ends immediately, the job will not even be enqueued.

  • #1835 Docker image is now built only when a release is tagged, and new tags are included, for minor and major versions.

  • #1055 Update OAS definition to v3.1.

  • #1885 Update to chronos 3.0.

  • #1896 Requests to health endpoint are no longer logged.

  • #1877 Print a warning when manually running visit:download-db command and a GeoLite2 license was not provided.

Deprecated

  • #1783 Deprecated support for openswoole. RoadRunner is the best replacement, with the same capabilities, but much easier and convenient to install and manage.

Removed

  • #1790 Drop support for PHP 8.1.

Fixed

  • #1819 Fix incorrect timeout when running DB commands during Shlink start-up.
  • #1901 Do not allow short URLs with custom slugs containing URL-reserved characters, as they will not work at all afterward.
  • #1900 Fix short URL visits deletion when multi-segment slugs are enabled.

[3.6.4] - 2023-09-23

Added

  • Nothing

Changed

  • #1866 The INITIAL_API_KEY env var is now only relevant for the official docker image.

    Going forward, new non-docker Shlink installations provisioned with env vars that also wish to provide an initial API key, should do it by using the vendor/bin/shlink-installer init --initial-api-key=%SOME_KEY% command, instead of using INITIAL_API_KEY.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1819 Fix incorrect timeout when running DB commands during Shlink start-up.
  • #1870 Make sure shared locks include the cache prefix when using Redis.
  • #1866 Fix error when starting docker image with INITIAL_API_KEY env var.

[3.6.3] - 2023-06-14

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1817 Fix Shlink trying to create SQLite database tables even if they already exist.

[3.6.2] - 2023-06-08

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1808 Fix rr binary downloading during Shlink update.

[3.6.1] - 2023-06-04

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1413 Fix error when creating initial DB in Postgres in a cluster where a default postgres db does not exist or the credentials do not grant permissions to connect.
  • #1803 Fix default RoadRunner port when not using docker image.

[3.6.0] - 2023-05-24

Added

  • #1148 Add support to delete short URL visits.

    This can be done via DELETE /short-urls/{shortCode}/visits REST endpoint or via short-url:visits-delete console command.

    The CLI command includes a warning and requires the user to confirm before proceeding.

  • #1681 Add support to delete orphan visits.

    This can be done via DELETE /visits/orphan REST endpoint or via visit:orphan-delete console command.

    The CLI command includes a warning and requires the user to confirm before proceeding.

  • #1753 Add a new vendor/bin/shlink-installer init command that can be used to automate Shlink installations.

    This command can create the initial database, update it, create proxies, clean cache, download initial GeoLite db files, etc

    The official docker image also uses it on its entry point script.

  • #1656 Add support for openswoole 22

  • #1784 Add new docker tag where the container runs as a non-root user.

  • #953 Add locks that prevent errors on duplicated keys when creating short URLs in parallel that depend on the same new tag or domain.

Changed

  • #1755 Update to roadrunner 2023

  • #1745 Roadrunner is now the default docker runtime.

    There are now three different docker images published:

    • Versions without suffix (like 3.6.0) will contain the default runtime, whichever it is.
    • Versions with -roadrunner suffix (like 3.6.0-roadrunner) will always use roadrunner as the runtime, even if default one changes in the future.
    • Versions with -openswoole suffix (like 3.6.0-openswoole) will always use openswoole as the runtime, even if default one changes in the future.

Deprecated

  • Deprecated ENABLE_PERIODIC_VISIT_LOCATE env var. Use an external mechanism to automate visit locations.

Removed

  • Nothing

Fixed

  • #1760 Fix domain not being set to null when importing short URLs with default domain.
  • #953 Fix duplicated key errors and short URL creation failing when creating short URLs in parallel that depend on the same new tag or domain.
  • #1741 Fix randomly using 100% CPU in task workers when trying to download GeoLite DB files.
  • Fix Shlink trying to connect to RabbitMQ even if configuration set to not connect.

[3.5.4] - 2023-04-12

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1742 Fix URLs using schemas which do not contain //, like mailto:, to no longer be considered valid.

  • #1743 Fix Error when trying to create short URLs from CLI on an openswoole context.

    Unfortunately the reason are real-time updates do not work with openswoole when outside an openswoole request, so the feature has been disabled for that context.

[3.5.3] - 2023-03-31

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1715 Fix short URL creation/edition allowing long URLs without schema. Now a validation error is thrown.
  • #1537 Fix incorrect list of tags being returned for some author-only API keys.
  • #1738 Fix memory leak when importing short URLs with many visits.

[3.5.2] - 2023-02-16

Added

  • Nothing

Changed

  • #1696 Migrated to PHPUnit 10.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1698 Fixed error 500 in robots.txt.
  • #1688 Fixed huge performance degradation on /tags/stats endpoint.
  • #1693 Fixed Shlink thinking database already exists if it finds foreign tables.

[3.5.1] - 2023-02-04

Added

  • Nothing

Changed

  • #1685 Changed loosely mode to loose, as it was a typo. The old one keeps working and maps to the new one, but it's considered deprecated.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1682 Fixed incorrect case-insensitive checks in short URLs when using Microsoft SQL server.
  • #1684 Fixed entities metadata cache not being cleared at docker container start-up when using redis with replication.

[3.5.0] - 2023-01-28

Added

  • #1557 Added support to dynamically redirect to different long URLs based on the visitor's device type.

    For the moment, only android, ios and desktop can have their own specific long URL, and when the visitor cannot be matched against any of them, the regular long URL will be used.

    In the future, more granular device types could be added if appropriate (iOS tablet, android table, tablet, mobile phone, Linux, Mac, Windows, etc).

    In order to match the visitor's device, the User-Agent header is used.

  • #1632 Added amount of bots, non-bots and total visits to the visits summary endpoint.

  • #1633 Added amount of bots, non-bots and total visits to the tag stats endpoint.

  • #1653 Added support for all HTTP methods in short URLs, together with two new redirect status codes, 307 and 308.

    Existing Shlink instances will continue to work the same. However, if you decide to set the redirect status codes as 307 or 308, Shlink will also return a redirect for short URLs even when the request method is different from GET.

    The status 308 is equivalent to 301, and 307 is equivalent to 302. The difference is that the spec requires the client to respect the original HTTP method when performing the redirect. With 301 and 302, some old clients might perform a GET request during the redirect, regardless the original request method.

  • #1662 Added support to provide openswoole-specific config options via env vars prefixed with OPENSWOOLE_.

  • #1389 and #706 Added support for case-insensitive short URLs.

    In order to achieve this, a new env var/config option has been implemented (SHORT_URL_MODE), which allows either strict or loosely loose.

    Default value is strict, but if loose is provided, then short URLs will be matched in a case-insensitive way, and new short URLs will be generated with short-codes in lowercase only.

Changed

  • Nothing

Deprecated

  • #1676 Deprecated GET /short-urls/shorten endpoint. Use POST /short-urls to create short URLs instead.
  • #1678 Deprecated validateUrl option on URL creation/edition.

Removed

  • Nothing

Fixed

  • #1639 Fixed 500 error returned when request body is not valid JSON, instead of a proper descriptive error.

[3.4.0] - 2022-12-16

Added

  • #1612 Allowed to filter short URLs out of lists, when validUntil date is in the past or have reached their maximum amount of visits.

    This can be done by:

    • Providing excludeMaxVisitsReached=true and/or excludePastValidUntil=true to the GET /short-urls endpoint.
    • Providing --exclude-max-visits-reached and/or --exclude-past-valid-until to the short-urls:list command.
  • #1613 Added amount of visits coming from bots, non-bots and total to every short URL in the short URLs list.

    Additionally, added option to order by non-bot visits, by passing nonBotVisits-DESC or nonBotVisits-ASC.

  • #1599 Added support for credentials on redis DSNs, either only password, or both username and password.

  • #1616 Added support to import orphan visits when importing short URLs from another Shlink instance.

  • #1519 Allowing to search short URLs by default domain.

  • #1555 and #1625 Added full support for PHP 8.2, updating the docker image to this version.

Changed

  • #1563 Moved logic to reuse command options to option classes instead of base abstract command classes.
  • #1569 Migrated test doubles from phpspec/prophecy to PHPUnit mocks.
  • #1329 Split some logic from VisitRepository and ShortUrlRepository into separated repository classes.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1618 Fixed imported short URLs and visits dates not being set to the target server timezone.
  • #1578 Fixed short URL allowing an empty string as the domain during creation.
  • #1580 Fixed FLUSHDB being run on Shlink docker start-up when using redis, causing full cache to be flushed.

[3.3.2] - 2022-10-18

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1576 Fixed error when trying to retry visits location from CLI.

[3.3.1] - 2022-09-30

Added

  • Nothing

Changed

  • #1474 Added preliminary support for PHP 8.2 during CI workflow.
  • #1551 Moved services related to geolocating visits to the Visit\Geolocation namespace.
  • #1550 Reorganized main namespaces from Core module.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1556 Fixed trailing slash not working when enabling multi-segment slashes.

[3.3.0] - 2022-09-18

Added

  • #1221 Added experimental support to run Shlink with RoadRunner instead of openswoole.

  • #1531 and #1090 Added support for trailing slashes in short URLs.

  • #1406 Added new REST API version 3.

    When making requests to the REST API with /rest/v3/... and an error occurs, all error types will be different, with the next correlation:

    • INVALID_ARGUMENT -> https://shlink.io/api/error/invalid-data
    • INVALID_SHORT_URL_DELETION -> https://shlink.io/api/error/invalid-short-url-deletion
    • DOMAIN_NOT_FOUND -> https://shlink.io/api/error/domain-not-found
    • FORBIDDEN_OPERATION -> https://shlink.io/api/error/forbidden-tag-operation
    • INVALID_URL -> https://shlink.io/api/error/invalid-url
    • INVALID_SLUG -> https://shlink.io/api/error/non-unique-slug
    • INVALID_SHORTCODE -> https://shlink.io/api/error/short-url-not-found
    • TAG_CONFLICT -> https://shlink.io/api/error/tag-conflict
    • TAG_NOT_FOUND -> https://shlink.io/api/error/tag-not-found
    • MERCURE_NOT_CONFIGURED -> https://shlink.io/api/error/mercure-not-configured
    • INVALID_AUTHORIZATION -> https://shlink.io/api/error/missing-authentication
    • INVALID_API_KEY -> https://shlink.io/api/error/invalid-api-key

    If you make a request to the API with v2 or v1, the old error types will be returned, until Shlink 4 is released, when only the new ones will be used.

    Non-error responses are not affected.

  • #1513 Added publishing of the docker image in GHCR.

  • #1114 Added support to provide an initial API key via INITIAL_API_KEY env var, when running Shlink with openswoole or RoadRunner.

    Also, the installer tool now allows to generate an initial API key that can be copy-pasted (this tool is run interactively), in case you use php-fpm or you don't want to use env vars.

  • #1528 Added support to delay when the GeoLite2 DB file is downloaded in docker images, speeding up its startup time.

    In order to do it, pass SKIP_INITIAL_GEOLITE_DOWNLOAD=true when creating the container.

Changed

  • #1339 Added new test suite for CLI E2E tests.
  • #1503 Drastically improved build time in GitHub Actions, by optimizing parallelization and adding php extensions cache.
  • #1525 Migrated to custom doctrine CLI entry point.
  • #1492 Migrated to immutable options objects, mapped with cuyz/valinor.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[3.2.1] - 2022-08-08

Added

  • Nothing

Changed

  • #1495 Centralized how routes are configured to support multi-segment slugs.
  • #1497 Updated to latest shlink dependencies with support for PHP 8.1 only.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1499 Fixed loading of config options as env vars, which was making all default configurations to be loaded unless env vars were explicitly provided.

[3.2.0] - 2022-08-05

Added

  • #854 Added support for multi-segment custom slugs.

    The feature is disabled by default, but you can optionally opt in. If you do, you will be able to create short URLs with multiple segments in the custom slug, like https://example.com/foo/bar/baz.

  • #1280 Added missing visit-related commands.

    Now you can run tag:visits, domain:visits, visit:orphan or visit:non-orphan to get the corresponding list of visits from the command line.

  • #962 Added new real-time update for new short URLs.

    You can now subscribe to the https://shlink.io/new-short-url topic on any of the supported async updates technologies in order to get notified when a short URL is created.

  • #1367 Added support to publish real-time updates in redis pub/sub.

    The publishing will happen in the same redis instance/cluster configured for caching.

Changed

  • #1452 Updated to monolog 3

  • #1485 Changed payload published in RabbitMQ for all visits events, in order to conform with the Async API spec.

    Since this is a breaking change, also provided a new RABBITMQ_LEGACY_VISITS_PUBLISHING=true env var that can be provided in order to keep the old payload.

    This env var is considered deprecated and will be removed in Shlink 4, when the legacy format will no longer be supported.

Deprecated

  • Nothing

Removed

  • #1280 Dropped support for PHP 8.0

Fixed

  • #1471 Fixed error when running visit:locate command with any extra parameter (like --retry).

[3.1.2] - 2022-06-04

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1448 Fixed HTML entities not being properly parsed when auto-resolving page titles.
  • #1458 Fixed 500 error when filtering short URLs by ALL tags and search term.

[3.1.1] - 2022-05-09

Added

  • Nothing

Changed

  • #1444 Updated docker image to openswoole 4.11.1, in an attempt to fix error.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1439 Fixed crash when trying to auto-resolve titles for URLs which serve large binary files.

[3.1.0] - 2022-04-23

Added

  • #1294 Allowed to provide a specific domain when importing URLs from YOURLS.

  • #1416 Added support to import URLs from Kutt.it.

  • #1418 Added support to customize the timezone used by Shlink, falling back to the default one set in PHP config.

    The timezone can be set via the TIMEZONE env var, or using the installer tool.

  • #1309 Improved URL importing, ensuring individual errors do not make the whole process fail, and instead, failing URLs are skipped.

  • #1162 Added new endpoint to get visits by domain.

    The endpoint is GET /domains/{domain}/visits, and it has the same capabilities as any other visits endpoint, allowing pagination and filtering.

Changed

  • #1359 Hidden database commands.
  • #1385 Prevented a big error message from being logged when using Shlink without mercure.
  • #1398 Increased required mutation score for unit tests to 85%.
  • #1419 Input dates are now parsed to Shlink's configured timezone or default timezone before using them for database queries.
  • #1428 Updated native dependencies in docker image and base image to PHP v8.1.5.

Deprecated

  • #1340 Deprecated webhooks. New events will only be added to other real-time updates approaches, and webhooks will be completely removed in Shlink 4.0.0.

Removed

  • Nothing

Fixed

  • #1397 Fixed db:create command always reporting the schema exists if the db:migrate command has been run before by mistake.
  • #1402 Fixed the base path getting appended with the default domain by mistake, causing multiple side effects in several places.

[3.0.3] - 2022-02-19

Added

  • Nothing

Changed

  • #1382 Updated docker image to PHP 8.1.3.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1377 Fixed installer always setting delete threshold with value 1.
  • #1379 Ensured API keys cannot be created with a domain-only role linked to default domain.

[3.0.2] - 2022-02-10

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1373 Fixed incorrect config import when updating from Shlink 2.x using SQLite.
  • #1369 Fixed slow regexps in .htaccess file.

[3.0.1] - 2022-02-04

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1363 Fixed titles being resolved no matter what when validateUrl is not set or is explicitly set to true.
  • #1352 Updated to stable pdo_sqlsrv in docker image.

[3.0.0] - 2022-01-28

Added

  • #767 Added full support to use emojis everywhere, whether it is custom slugs, titles, referrers, etc.

  • #1274 Added support to filter short URLs lists by all provided tags.

    The GET /short-urls endpoint now accepts a tagsMode=all param which will make only short URLs matching all the tags in the tags[] query param, to be returned.

    The short-urls:list command now accepts a -i/--including-all-tags flag which behaves the same.

  • #1273 Added support for pagination in tags lists, allowing to improve performance by loading subsets of tags.

    For backwards compatibility, lists continue returning all items by default, but the GET /tags endpoint now supports page and itemsPerPage query params, to make sure only a subset of the tags is returned.

    This is supported both when invoking the endpoint with and without withStats=true query param.

    Additionally, the endpoint also supports filtering by searchTerm query param. When provided, only tags matching it will be returned.

  • #1063 Added new endpoint that allows fetching all existing non-orphan visits, in case you need a global view of all visits received by your Shlink instance.

    This can be achieved using the GET /visits/non-orphan endpoint.

Changed

  • #1277 Reduced docker image size to 45% of the original size.
  • #1268 Updated dependencies, including symfony/console 6 and mezzio/mezzio-swoole 4.
  • #1283 Changed behavior of DELETE_SHORT_URL_THRESHOLD env var, disabling the feature if a value was not provided.
  • #1300 Changed default ordering for short URLs list, returning always from newest to oldest.
  • #1299 Updated to the latest base docker images, based in PHP 8.1.1, and bumped openswoole to v4.9.1.
  • #1282 Env vars now have precedence over installer options.
  • #1328 Refactored ShortUrlsRepository to use DTOs in methods with too many arguments.

Deprecated

  • #1315 Deprecated GET /tags?withStats=true endpoint. Use GET /tags/stats instead.

Removed

  • #1275 Removed everything that was deprecated in Shlink 2.x.

    See UPGRADE doc in order to get details on how to migrate to this version.

  • #1347 Dropped support for regular swoole in favor of openswoole.

    Since openswoole support was introduced in the previous release version, Shlink will still consider the swoole extension as openswoole, as at the moment, functionality hasn't deviated too much, and will simplify migrating to Shlink 3.0.0

    However, there's no longer active testing with regular swoole, and it is considered no longer supported. If some incompatibility arises, the only supported solution will be to migrate to openswoole.

Fixed

  • Nothing

[2.10.3] - 2022-01-23

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1349 Fixed memory leak in cache implementation.

[2.10.2] - 2022-01-07

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1293 Fixed error when trying to create/import short URLs with a too long title.
  • #1306 Ensured remote IP address is not logged when using swoole/openswoole.
  • #1308 Fixed memory leak when using redis due to the amount of non-expiring keys created by doctrine. Now they have a 24h expiration by default.

[2.10.1] - 2021-12-21

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1285 Fixed error caused by database connections expiring after some hours of inactivity.
  • #1286 Fixed x-request-id header not being generated during non-rest requests.

[2.10.0] - 2021-12-12

Added

  • #1163 Allowed setting not-found redirects for default domain in the same way it's done for any other domain.

    This implies a few non-breaking changes:

    • The domains list no longer has the values of INVALID_SHORT_URL_REDIRECT_TO, REGULAR_404_REDIRECT_TO and BASE_URL_REDIRECT_TO on the default domain redirects.
    • The GET /domains endpoint includes a new defaultRedirects property in the response, with the default redirects set via config or env vars.
    • The INVALID_SHORT_URL_REDIRECT_TO, REGULAR_404_REDIRECT_TO and BASE_URL_REDIRECT_TO env vars are now deprecated, and should be replaced by DEFAULT_INVALID_SHORT_URL_REDIRECT, DEFAULT_REGULAR_404_REDIRECT and DEFAULT_BASE_URL_REDIRECT respectively. Deprecated ones will continue to work until v3.0.0, where they will be removed.
  • #868 Added support to publish real-time updates in a RabbitMQ server.

    Shlink will create new exchanges and queues for every topic documented in the Async API spec, meaning, you will have one queue for orphan visits, one for regular visits, and one queue for every short URL with its visits.

    The RabbitMQ server config can be provided via installer config options, or via environment variables.

  • #1204 Added support for openswoole and migrated official docker image to openswoole.

  • #1242 Added support to import urls and visits from YOURLS.

    In order to do it, you need to first install this dedicated plugin in YOURLS, and then run the short-url:import yourls command, as with any other source.

  • #1235 Added support to disable rounding QR codes block sizing via config option, env var or query param.

  • #1188 Added support for PHP 8.1.

    The official docker image has also been updated to use PHP 8.1 by default.

Changed

  • #844 Added mutation checks to API tests.
  • #1218 Updated to symfony/mercure 0.6.
  • #1223 Updated to phpstan 1.0.
  • #1258 Updated to Symfony 6 components, except symfony/console.
  • Added domain field to DeleteShortUrlException exception.

Deprecated

  • #1260 Deprecated USE_HTTPS env var that was added in previous release, in favor of the new IS_HTTPS_ENABLED.

    The old one proved to be confusing and misleading, making people think it was used to actually enable HTTPS transparently, instead of its actual purpose, which is just telling Shlink it is being served with HTTPS.

Removed

  • Nothing

Fixed

  • #1206 Fixed debugging of the docker image, so that it does not run the commands with -q when the SHELL_VERBOSITY env var has been provided.
  • #1254 Fixed examples in swagger docs.

[2.9.3] - 2021-11-15

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1232 Solved potential SQL injection by enforcing doctrine/dbal 3.1.4.

[2.9.2] - 2021-10-23

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1210 Fixed real time updates not being notified due to an incorrect handling of db transactions on multi-process tasks.
  • #1211 Fixed There is no active transaction error when running migrations in MySQL/Mariadb after updating to doctrine-migrations 3.3.
  • #1197 Fixed amount of task workers provided via config option or env var not being validated to ensure enough workers to process all parallel tasks.

[2.9.1] - 2021-10-11

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1201 Fixed crash when using the new USE_HTTPS, as it's boolean raw value was being used instead of resolving "https" or "http".

[2.9.0] - 2021-10-10

Added

  • #1015 Shlink now accepts configuration via env vars even when not using docker.

    The config generated with the installing tool still has precedence over the env vars, so it cannot be combined. Either you use the tool, or use env vars.

  • #1149 Allowed to set custom defaults for the QR codes.

  • #1112 Added new option to define if the query string should be forwarded on a per-short URL basis.

    The new forwardQuery=true|false param can be provided during short URL creation or edition, via REST API or CLI command, allowing to override the default behavior which makes the query string to always be forwarded.

  • #1105 Added support to define placeholders on not-found redirects, so that the redirected URL receives the originally visited path and/or domain.

    Currently, {DOMAIN} and {ORIGINAL_PATH} placeholders are supported, and they can be used both in the redirected URL's path or query.

    When they are used in the query, the values are URL encoded.

  • #1119 Added support to provide redis sentinel when using redis cache.

  • #1016 Added new option to send orphan visits to webhooks, via NOTIFY_ORPHAN_VISITS_TO_WEBHOOKS env var or installer tool.

    The option is disabled by default, as the payload is backwards incompatible. You will need to adapt your webhooks to treat the shortUrl property as optional before enabling this option.

  • #1104 Added ability to disable tracking based on IP addresses.

    IP addresses can be provided in the form of fixed addresses, CIDR blocks, or wildcard patterns (192.168..).

Changed

  • #1142 Replaced doctrine/cache package with symfony/cache.
  • #1157 All routes now support CORS, not only rest ones.
  • #1144 Added experimental builds under PHP 8.1.

Deprecated

  • #1164 Deprecated SHORT_DOMAIN_HOST and SHORT_DOMAIN_SCHEMA env vars. Use DEFAULT_DOMAIN and USE_HTTPS=true|false instead.

Removed

  • Nothing

Fixed

  • #1165 Fixed warning displayed when trying to locate visits and there are none pending.
  • #1172 Removed unneeded explicitly defined volumes in docker image.

[2.8.1] - 2021-08-15

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1155 Fixed numeric query params in long URLs being replaced by 0.

[2.8.0] - 2021-08-04

Added

  • #1089 Added new ENABLE_PERIODIC_VISIT_LOCATE env var to docker image which schedules the visit:locate command every hour when provided with value true.

  • #1082 Added support for error correction level on QR codes.

    Now, when calling the GET /{shorCode}/qr-code URL, you can pass the errorCorrection query param with values L for Low, M for Medium, Q for Quartile or H for High.

  • #1080 Added support to redirect to URLs as soon as the path starts with a valid short code, appending the rest of the path to the redirected long URL.

    With this, if you have the https://example.com/abc123 short URL redirecting to https://www.twitter.com, a visit to https://example.com/abc123/shlinkio will take you to https://www.twitter.com/shlinkio.

    This behavior needs to be actively opted in, via installer config options or env vars.

  • #943 Added support to define different "not-found" redirects for every domain handled by Shlink.

    Shlink will continue to allow defining the default values via env vars or config, but afterwards, you can use the domain:redirects command or the PATCH /domains/redirects REST endpoint to define specific values for every single domain.

Changed

  • #1118 Increased phpstan required level to 8.
  • #1127 Updated to infection 0.24.
  • #1139 Updated project dependencies, including base docker image to use PHP 8.0.9 and Alpine 3.14.

Deprecated

  • Nothing

Removed

  • #1046 Dropped support for PHP 7.4.

Fixed

  • #1098 Fixed errors when using Redis for caching, caused by some third party lib bug that was fixed on dependencies update.

[2.7.3] - 2021-08-02

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1135 Fixed error when importing short URLs with no visits from another Shlink instance.
  • #1136 Fixed error when fetching tag/short-url/orphan visits for a page lower than 1.

[2.7.2] - 2021-07-30

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1128 Increased memory limit reserved for the docker image, preventing it from crashing on GeoLite db download.

[2.7.1] - 2021-05-30

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1100 Fixed Shlink trying to download GeoLite2 db files even when tracking has been disabled.

[2.7.0] - 2021-05-23

Added

  • #1044 Added ability to set names on API keys, which helps to identify them when the list grows.

  • #819 Visits are now always located in real time, even when not using swoole.

    The only side effect is that a GeoLite2 db file is now installed when the docker image starts or during shlink installation or update.

    Also, when using swoole, the file is now updated after tracking a visit, which means it will not apply until the next one.

  • #1059 Added ability to optionally display author API key and its name when listing short URLs from the command line.

  • #1066 Added support to import short URLs and their visits from another Shlink instance using its API.

  • #898 Improved tracking granularity, allowing to disable visits tracking completely, or just parts of it.

    In order to achieve it, Shlink now supports 4 new tracking-related options, that can be customized via env vars for docker, or via installer:

    • disable_tracking: If true, visits will not be tracked at all.
    • disable_ip_tracking: If true, visits will be tracked, but neither the IP address, nor the location will be resolved.
    • disable_referrer_tracking: If true, the referrer will not be tracked.
    • disable_ua_tracking: If true, the user agent will not be tracked.
  • #955 Added new option to set short URLs as crawlable, making them be listed in the robots.txt as Allowed.

  • #900 Shlink now tries to detect if the visit is coming from a potential bot or crawler, and allows to exclude those visits from visits lists if desired.

Changed

  • #1036 Updated to happyr/doctrine-specification 2.0.
  • #1039 Updated to endroid/qr-code 4.0.
  • #1008 Ensured all logs are sent to the filesystem while running API tests, which helps debugging the reason for tests to fail.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1041 Ensured the default value for the version while building the docker image is latest.
  • #1067 Fixed exception when persisting multiple short URLs in one batch which include the same new tags/domains. This can potentially happen when importing URLs.

[2.6.2] - 2021-03-12

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1047 Fixed error in migrations when doing a fresh installation using PHP8 and MySQL/Mariadb databases.

[2.6.1] - 2021-02-22

Added

  • Nothing

Changed

  • #1026 Removed non-inclusive terms from source code.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #1024 Fixed migration that is incorrectly skipped due to the wrong condition being used to check it.
  • #1031 Fixed shortening of twitter URLs with URL validation enabled.
  • #1034 Fixed warning displayed when shlink is stopped while running it with swoole.

[2.6.0] - 2021-02-13

Added

  • #856 Added PHP 8.0 support.

  • #941 Added support to provide a title for every short URL.

    The title can also be automatically resolved from the long URL, when no title was explicitly provided, but this option needs to be opted in.

  • #913 Added support to import short URLs from a standard CSV file.

    The file requires the Long URL and Short code columns, and it also accepts the optional title, domain and tags columns.

  • #1000 Added support to provide a margin query param when generating some URL's QR code.

  • #675 Added ability to track visits to the base URL, invalid short URLs or any other "not found" URL, as known as orphan visits.

    This behavior is enabled by default, but you can opt out via env vars or config options.

    This new orphan visits can be consumed in these ways:

    • The https://shlink.io/new-orphan-visit mercure topic, which gets notified when an orphan visit occurs.
    • The GET /visits/orphan REST endpoint, which behaves like the short URL visits and tags visits endpoints, but returns only orphan visits.

Changed

  • #977 Migrated from laminas/laminas-paginator to pagerfanta/core to handle pagination.

  • #986 Updated official docker image to use PHP 8.

  • #1010 Increased timeout for database commands to 10 minutes.

  • #874 Changed how dist files are generated. Now there will be two for every supported PHP version, with and without support for swoole.

    The dist files will have been built under the same PHP version they are meant to be run under, ensuring resolved dependencies are the proper ones.

Deprecated

  • #959 Deprecated all command flags using camelCase format (like --expirationDate), adding kebab-case replacements for all of them (like --expiration-date).

    All the existing camelCase flags will continue working for now, but will be removed in Shlink 3.0.0

  • #862 Deprecated the endpoint to edit tags for a short URL (PUT /short-urls/{shortCode}/tags).

    The short URL edition endpoint (PATCH /short-urls/{shortCode}) now supports setting the tags too. Use it instead.

Removed

  • Nothing

Fixed

  • #988 Fixed serving zero-byte static files in apache and apache-compatible web servers.
  • #990 Fixed short URLs not properly composed in REST API endpoints when both custom domain and custom base path are used.
  • #1002 Fixed weird behavior in which GeoLite2 metadata's buildEpoch is parsed as string instead of int.
  • #851 Fixed error when trying to schedule swoole tasks in ARM architectures (like raspberry).

[2.5.2] - 2021-01-24

Added

  • #965 Added docs section for Architectural Decision Records, including the one for API key roles.

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #979 Added missing itemsPerPage query param to swagger docs for short URLs list.
  • #980 Fixed value used for Access-Control-Allow-Origin, that could not work as expected when including an IP address.
  • #947 Fixed incorrect value returned in Access-Control-Allow-Methods header, which always contained all methods.

[2.5.1] - 2021-01-21

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #968 Fixed index error in MariaDB while updating to v2.5.0.
  • #972 Fixed 500 error when calling single-step short URL creation endpoint.

[2.5.0] - 2021-01-17

Added

  • #795 and #882 Added new roles system to API keys.

    API keys can have any combinations of these two roles now, allowing to limit their interactions:

    • Can interact only with short URLs created with that API key.
    • Can interact only with short URLs for a specific domain.
  • #833 Added support to connect through unix socket when using an external MySQL, MariaDB or Postgres database.

    It can be provided during the installation, or as the DB_UNIX_SOCKET env var for the docker image.

  • #869 Added support for Mercure Hub 0.10.

  • #896 Added support for unicode characters in custom slugs.

  • #930 Added new bin/set-option script that allows changing individual configuration options on existing shlink instances.

  • #877 Improved API tests on CORS, and "refined" middleware handling it.

Changed

  • #912 Changed error templates to be plain html files, removing the dependency on league/plates package.
  • #875 Updated to mezzio/mezzio-swoole v3.1.
  • #952 Simplified in-project docs, by keeping only the basics and linking to the websites docs for anything else.

Deprecated

  • #917 Deprecated /{shortCode}/qr-code/{size} URL, in favor of providing the size in the query instead, /{shortCode}/qr-code?size={size}.
  • #924 Deprecated mechanism to provide config options to the docker image through volumes. Use the env vars instead as a direct replacement.

Removed

  • Nothing

Fixed

  • Nothing

[2.4.2] - 2020-11-22

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #904 Explicitly added missing "Domains" and "Integrations" tags to swagger docs.
  • #901 Ensured domains which are not in use on any short URL are not returned on the list of domains.
  • #899 Avoided filesystem errors produced while downloading geolite DB files on several shlink instances that share the same filesystem.
  • #827 Fixed swoole config getting loaded in config cache if a console command is run before any web execution, when swoole extension is enabled, making subsequent non-swoole web requests fail.

[2.4.1] - 2020-11-10

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #891 Fixed error when running migrations in postgres due to incorrect return type hint.
  • #846 Fixed base image used for the PHP-FPM dev container.
  • #867 Fixed not-found redirects not using proper status (301 or 302) as configured during installation.

[2.4.0] - 2020-11-08

Added

  • #829 Added support for QR codes in SVG format, by passing ?format=svg to the QR code URL.

  • #820 Added new option to force enabling or disabling URL validation on a per-URL basis.

    Currently, there's a global config that tells if long URLs should be validated (by ensuring they are publicly accessible and return a 2xx status). However, this is either always applied or never applied.

    Now, it is possible to enforce validation or enforce disabling validation when a new short URL is created or edited:

    • On the POST /short-url and PATCH /short-url/{shortCode} endpoints, you can now pass validateUrl: true/false in order to enforce enabling or disabling validation, ignoring the global config. If the value is not provided, the global config is still normally applied.
    • On the short-url:generate CLI command, you can pass --validate-url or --no-validate-url flags, in order to enforce enabling or disabling validation. If none of them is provided, the global config is still normally applied.
  • #838 Added new endpoint and CLI command to list existing domains.

    It returns both default domain and specific domains that were used for some short URLs.

    • REST endpoint: GET /rest/v2/domains
    • CLI Command: domain:list
  • #832 Added support to customize the port in which the docker image listens by using the PORT env var or the port config option.

  • #860 Added support to import links from bit.ly.

    Run the command short-urls:import bitly and introduce requested information in order to import all your links.

    Other sources will be supported in future releases.

Changed

  • #836 Added support for the <field>-<dir> notation while determining how to order the short URLs list, as in ?orderBy=shortCode-DESC. This effectively deprecates the array notation (?orderBy[shortCode]=DESC), that will be removed in Shlink 3.0.0
  • #782 Added code coverage to API tests.
  • #858 Updated to latest infection version. Updated docker images to PHP 7.4.11 and swoole 4.5.5
  • #887 Started tracking the API key used to create short URLs, in order to allow restrictions in future releases.

Deprecated

  • #883 Deprecated POST /tags endpoint and tag:create command, as tags are created automatically while creating short URLs.

Removed

  • Nothing

Fixed

  • #837 Drastically improved performance when creating a new shortUrl and providing findIfExists = true.
  • #878 Added missing gmp extension to the official docker image.

[2.3.0] - 2020-08-09

Added

  • #746 Allowed to configure the kind of redirect you want to use for your short URLs. You can either set:

    • 302 redirects: Default behavior. Visitors always hit the server.
    • 301 redirects: Better for SEO. Visitors hit the server the first time and then cache the redirect.

    When selecting 301 redirects, you can also configure the time redirects are cached, to mitigate deviations in stats.

  • #734 Added support to redirect to deeplinks and other links with schemas different from http and https.

  • #709 Added multi-architecture builds for the docker image.

  • #707 Added --all flag to short-urls:list command, which will print all existing URLs in one go, with no pagination.

    It has one limitation, though. Because of the way the CLI tooling works, all rows in the table must be loaded in memory. If the amount of URLs is too high, the command may fail due to too much memory usage.

Changed

  • #508 Added mutation checks to database tests.
  • #790 Updated to doctrine/migrations v3.
  • #798 Updated to guzzlehttp/guzzle v7.
  • #822 Updated docker image to use PHP 7.4.9 with Alpine 3.12 and swoole 4.5.2.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[2.2.2] - 2020-06-08

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #769 Fixed custom slugs not allowing valid URL characters, like ., _ or ~.
  • #781 Fixed memory leak when loading visits for a tag which is used for big amounts of short URLs.

[2.2.1] - 2020-05-11

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #764 Fixed error when trying to match an existing short URL which does not have validSince and/or validUntil, but you are providing either one of them for the new one.

[2.2.0] - 2020-05-09

Added

  • #712 Added support to integrate Shlink with a mercure hub server.

    Thanks to that, Shlink will be able to publish events that can be consumed in real time.

    For now, two topics (events) are published, when new visits occur. Both include a payload with the visit and the shortUrl:

      * A visit occurs on any short URL: `https://shlink.io/new-visit`.
      * A visit occurs on short URLs with a specific short code: `https://shlink.io/new-visit/{shortCode}`.
    

    The updates are only published when serving Shlink with swoole.

    Also, Shlink exposes a new endpoint GET /rest/v2/mercure-info, which returns the public URL of the mercure hub, and a valid JWT that can be used to subscribe to updates.

  • #673 Added new [GET /visits] rest endpoint which returns basic visits stats.

  • #674 Added new [GET /tags/{tag}/visits] rest endpoint which returns visits by tag.

    It works in the same way as the [GET /short-urls/{shortCode}/visits] one, returning the same response payload, and supporting the same query params, but the response is the list of visits in all short URLs which have provided tag.

  • #672 Enhanced [GET /tags] rest endpoint so that it is possible to get basic stats info for every tag.

    Now, if the withStats=true query param is provided, the response payload will include a new stats property which is a list with the amount of short URLs and visits for every tag.

    Also, the tag:list CLI command has been changed and it always behaves like this.

  • #640 Allowed to optionally disable visitors' IP address anonymization. This will make Shlink no longer be GDPR-compliant, but it's OK if you only plan to share your URLs in countries without this regulation.

Changed

  • #692 Drastically improved performance when loading visits. Specially noticeable when loading big result sets.
  • #657 Updated how DB tests are run in travis by using docker containers which allow all engines to be covered.
  • #751 Updated PHP and swoole versions used in docker image, and removed mssql-tools, as they are not needed.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #729 Fixed weird error when fetching multiple visits result sets concurrently using mariadb or mysql.
  • #735 Fixed error when cleaning metadata cache during installation when APCu is enabled.
  • #677 Fixed /health endpoint returning 503 fail responses when the database connection has expired.
  • #732 Fixed wrong client IP in access logs when serving app with swoole behind load balancer.

[2.1.4] - 2020-04-30

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #742 Allowed a custom GeoLite2 license key to be provided, in order to avoid download limits.

[2.1.3] - 2020-04-09

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #712 Fixed app set-up not clearing entities metadata cache.
  • #711 Fixed HEAD requests returning a duplicated Content-Length header.
  • #716 Fixed Twitter not properly displaying preview for final long URL.
  • #717 Fixed DB connection expiring on task workers when using swoole.
  • #705 Fixed how the short URL domain is inferred when generating QR codes, making sure the configured domain is respected even if the request is performed using a different one, and only when a custom domain is used, then that one is used instead.

[2.1.2] - 2020-03-29

Added

  • Nothing

Changed

  • #696 Updated to infection v0.16.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #700 Fixed migration not working with postgres.
  • #690 Fixed tags being incorrectly sluggified when filtering short URL lists, making results not be the expected.

[2.1.1] - 2020-03-28

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #697 Recovered .htaccess file that was unintentionally removed in v2.1.0, making Shlink unusable with Apache.

[2.1.0] - 2020-03-28

Added

  • #626 Added support for Microsoft SQL Server.
  • #556 Short code lengths can now be customized, both globally and on a per-short URL basis.
  • #541 Added a request ID that is returned on X-Request-Id header, can be provided from outside and is set in log entries.
  • #642 IP geolocation is now performed over the non-anonymized IP address when using swoole.
  • #521 The long URL for any existing short URL can now be edited using the PATCH /short-urls/{shortCode} endpoint.

Changed

  • #656 Updated to PHPUnit 9.

  • #641 Added two new flags to the visit:locate command, --retry and --all.

    • When --retry is provided, it will try to re-locate visits which IP address was originally considered not found, in case it was a temporal issue.
    • When --all is provided together with --retry, it will try to re-locate all existing visits. A warning and confirmation are displayed, as this can have side effects.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #665 Fixed base_url_redirect_to simplified config option not being properly parsed.
  • #663 Fixed Shlink allowing short URLs to be created with an empty custom slug.
  • #678 Fixed db commands not running in a non-interactive way.

[2.0.5] - 2020-02-09

Added

  • #651 Documented how Shlink behaves when using multiple domains.

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #648 Ensured any user can write in log files, in case shlink is run by several system users.
  • #650 Ensured default domain is ignored when trying to create a short URL.

[2.0.4] - 2020-02-02

Added

  • Nothing

Changed

  • #577 Wrapped params used to customize short URL lists into a DTO with implicit validation.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #620 Ensured "controlled" errors (like validation errors and such) won't be logged with error level, preventing logs to be polluted.
  • #637 Fixed several work flows in which short URLs with domain are handled form the API.
  • #644 Fixed visits to short URL on non-default domain being linked to the URL on default domain with the same short code.
  • #643 Fixed searching on short URL lists not taking into consideration the domain name.

[2.0.3] - 2020-01-27

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #624 Fixed order in which headers for remote IP detection are inspected.
  • #623 Fixed short URLs metadata being impossible to reset.
  • #628 Fixed GET /short-urls/{shortCode} REST endpoint returning a 404 for short URLs which are not enabled.
  • #621 Fixed permission denied error when updating same GeoLite file version more than once.

[2.0.2] - 2020-01-12

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #614 Fixed OPTIONS requests including the Origin header not always returning an empty body with status 2xx.
  • #615 Fixed query args with no value being lost from the long URL when users are redirected.

[2.0.1] - 2020-01-10

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #607 Added missing info on UPGRADE.md doc.
  • #610 Fixed use of hardcoded quotes on a database migration which makes it fail on postgres.
  • #605 Fixed crashes occurring when migrating from old Shlink versions with nullable DB columns that are assigned to non-nullable entity typed props.

[2.0.0] - 2020-01-08

Added

  • #429 Added support for PHP 7.4
  • #529 Created an UPGRADING.md file explaining how to upgrade from v1.x to v2.x
  • #594 Updated external shlink packages, including installer v4.0, which adds the option to ask for the redis cluster config.

Changed

Deprecated

  • Nothing

Removed

  • #429 Dropped support for PHP 7.2 and 7.3

  • #229 Remove everything which was deprecated, including:

    • Preview generation feature completely removed.
    • Authentication against REST API using JWT is no longer supported.

    See UPGRADE doc in order to get details on how to migrate to this version.

Fixed

  • #600 Fixed health action so that it works with and without version in the path.

[1.21.1] - 2020-01-02

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #596 Fixed error when trying to download GeoLite2 database due to changes on how to get the database files.

[1.21.0] - 2019-12-29

Added

  • #118 API errors now implement the problem details standard.

    In order to make it backwards compatible, two things have been done:

    • Both the old error and message properties have been kept on error response, containing the same values as the type and detail properties respectively.
    • The API v2 has been enabled. If an error occurs when calling the API with this version, the error and message properties will not be returned.

    After Shlink v2 is released, both API versions will behave like API v2.

  • #575 Added support to filter short URL lists by date ranges.

    • The GET /short-urls endpoint now accepts the startDate and endDate query params.
    • The short-urls:list command now allows --startDate and --endDate flags to be optionally provided.
  • #338 Added support to asynchronously notify external services via webhook, only when shlink is served with swoole.

    Configured webhooks will receive a POST request every time a URL receives a visit, including information about the short URL and the visit.

    The payload will look like this:

    {
      "shortUrl": {},
      "visit": {}
    }
    

    The shortUrl and visit props have the same shape as it is defined in the API spec.

Changed

  • #492 Updated to monolog 2, together with other dependencies, like Symfony 5 and infection-php.
  • #527 Increased minimum required mutation score for unit tests to 80%.
  • #557 Added a few php.ini configs for development and production docker images.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #570 Fixed shlink version generated for docker images when building from develop branch.

[1.20.3] - 2019-12-23

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #585 Fixed PHP Fatal error: Uncaught Error: Class 'Shlinkio\Shlink\LocalLockFactory' not found happening when running some CLI commands.

[1.20.2] - 2019-12-06

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #561 Fixed db:migrate command failing because yaml extension is not installed, which makes config file not to be readable.
  • #562 Fixed internal server error being returned when renaming a tag to another tag's name. Now a meaningful API error with status 409 is returned.
  • #555 Fixed internal server error being returned when invalid dates are provided for new short URLs. Now a 400 is returned, as intended.

[1.20.1] - 2019-11-17

Added

  • #519 Documented how to customize web workers and task workers for the docker image.

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #512 Fixed query params not being properly forwarded from short URL to long one.
  • #540 Fixed errors thrown when creating short URLs if the original URL has an internationalized domain name and URL validation is enabled.
  • #528 Ensured db:create and db:migrate commands do not silently fail when run as part of install or update.
  • #518 Fixed service which updates Geolite db file to use a local lock instead of a shared one, since every shlink instance holds its own db instance.

[1.20.0] - 2019-11-02

Added

  • #491 Added improved short code generation logic.

    Now, short codes are truly random, which removes the guessability factor existing in previous versions.

    Generated short codes have 5 characters, and shlink makes sure they keep unique, while making it backwards-compatible.

  • #418 and #419 Added support to redirect any 404 error to a custom URL.

    It was already possible to configure this but only for invalid short URLs. Shlink now also support configuring redirects for the base URL and any other kind of "not found" error.

    The three URLs can be different, and it is already possible to pass them to the docker image via configuration or env vars.

    The installer also asks for these two new configuration options.

  • #497 Officially added support for MariaDB.

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #507 Fixed error with too long original URLs by increasing size to the maximum value (2048) based on the standard.
  • #502 Fixed error when providing the port as part of the domain on short URLs.
  • #509 Fixed error when trying to generate a QR code for a short URL which uses a custom domain.
  • #522 Highly mitigated errors thrown when lots of short URLs are created concurrently including new and existing tags.

[1.19.0] - 2019-10-05

Added

  • #482 Added support to serve shlink under a sub path.

    The router.base_path config option can be defined now to set the base path from which shlink is served.

    return [
        'router' => [
            'base_path' => '/foo/bar',
        ],
    ];
    

    This option will also be available on shlink-installer 1.3.0, so the installer will ask for it. It can also be provided for the docker image as the BASE_PATH env var.

  • #479 Added preliminary support for multiple domains.

    Endpoints and commands which create short URLs support providing the domain now (via query param or CLI flag). If not provided, the short URLs will still be "attached" to the default domain.

    Custom slugs can be created on multiple domains, allowing to share links like https://s.test/my-campaign and https://example.com/my-campaign, under the same shlink instance.

    When resolving a short URL to redirect end users, the following rules are applied:

    • If the domain used for the request plus the short code/slug are found, the user is redirected to that long URL and the visit is tracked.
    • If the domain is not known but the short code/slug is defined for default domain, the user is redirected there and the visit is tracked.
    • In any other case, no redirection happens and no visit is tracked (if a fall back redirection is configured for not-found URLs, it will still happen).

Changed

  • #486 Updated to shlink-installer v2, which supports asking for base path in which shlink is served.

Deprecated

  • Nothing

Removed

  • #435 Removed translations for error pages. All error pages are in english now.

Fixed

  • Nothing

[1.18.1] - 2019-08-24

Added

  • Nothing

Changed

  • #450 Added PHP 7.4 to the build matrix, as an allowed-to-fail env.
  • #441 and #443 Split some logic into independent modules.
  • #451 Updated to infection 0.13.
  • #467 Moved docker image config to main Shlink repo.

Deprecated

  • #428 Deprecated preview-generation feature. It will keep working but it will be removed in Shlink v2.0.0

Removed

  • #468 Removed APCu extension from docker image.

Fixed

  • #449 Fixed error when trying to save too big referrers on PostgreSQL.

[1.18.0] - 2019-08-08

Added

  • #411 Added new meta property on the ShortUrl REST API model.

    These endpoints are affected and include the new property when suitable:

    • GET /short-urls - List short URLs.
    • GET /short-urls/shorten - Create a short URL (for integrations).
    • GET /short-urls/{shortCode} - Get one short URL.
    • POST /short-urls - Create short URL.

    The property includes the values validSince, validUntil and maxVisits in a single object. All of them are nullable.

    {
      "validSince": "2016-01-01T00:00:00+02:00",
      "validUntil": null,
      "maxVisits": 100
    }
    
  • #285 Visit location resolution is now done asynchronously but in real time thanks to swoole task management.

    Now, when a short URL is visited, a task is enqueued to locate it. The user is immediately redirected to the long URL, and in the background, the visit is located, making stats to be available a couple of seconds after the visit without the requirement of cronjobs being run constantly.

    Sadly, this feature is not enabled when serving shlink via apache/nginx, where you should still rely on cronjobs.

  • #384 Improved how remote IP addresses are detected.

    This new set of headers is now also inspected looking for the IP address:

    • CF-Connecting-IP
    • True-Client-IP
    • X-Real-IP
  • #440 Created db:create command, which improves how the shlink database is created, with these benefits:

    • It sets up a lock which prevents the command to be run concurrently.
    • It checks of the database does not exist, and creates it in that case.
    • It checks if the database tables already exist, exiting gracefully in that case.
  • #442 Created db:migrate command, which improves doctrine's migrations command by generating a lock, preventing it to be run concurrently.

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #416 Fixed error thrown when trying to locate visits after the GeoLite2 DB is downloaded for the first time.
  • #424 Updated wkhtmltoimage to version 0.12.5
  • #427 and #434 Fixed shlink being unusable after a database error on swoole contexts.

[1.17.0] - 2019-05-13

Added

  • #377 Updated visit:locate command (formerly visit:process) to automatically update the GeoLite2 database if it is too old or it does not exist.

    This simplifies processing visits in a container-based infrastructure, since a fresh container is capable of getting an updated version of the file by itself.

    It also removes the need of asynchronously and programmatically updating the file, which deprecates the visit:update-db command.

  • #373 Added support for a simplified config. Specially useful to use with the docker container.

Changed

  • #56 Simplified supported cache, requiring APCu always.

Deprecated

  • #406 Deprecated PUT /short-urls/{shortCode} REST endpoint in favor of PATCH /short-urls/{shortCode}.

Removed

  • #385 Dropped support for PHP 7.1
  • #379 Removed copyright from error templates.

Fixed

  • Nothing

[1.16.3] - 2019-03-30

Added

  • Nothing

Changed

  • #153 Updated to doctrine/migrations version 2.0.0
  • #376 Allowed visit:update-db command to not return an error exit code even if download fails, by passing the -i flag.
  • #341 Improved database tests so that they are executed against all supported database engines.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #382 Fixed existing short URLs not properly checked when providing the findIfExists flag.

[1.16.2] - 2019-03-05

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #368 Fixed error produced when running a SELECT COUNT(...) with ORDER BY in PostgreSQL databases.

[1.16.1] - 2019-02-26

Added

  • Nothing

Changed

  • #363 Updated to shlinkio/php-coding-standard version 1.1.0

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #362 Fixed all visits without an IP address being processed every time the visit:process command is executed.

[1.16.0] - 2019-02-23

Added

  • #304 Added health endpoint to check healthiness of the service. Useful in container-based infrastructures.

    Call [GET /rest/health] in order to get a response like this:

    HTTP/1.1 200 OK
    Content-Type: application/health+json
    Content-Length: 681
    
    {
      "status": "pass",
      "version": "1.16.0",
      "links": {
        "about": "https://shlink.io",
        "project": "https://github.com/shlinkio/shlink"
      }
    }
    

    The status code can be 200 OK in case of success or 503 Service Unavailable in case of error, while the status property will be one of pass or fail, as defined in the Health check RFC.

  • #279 Added new findIfExists flag to the [POST /short-url] REST endpoint and the short-urls:generate CLI command. It can be used to return existing short URLs when found, instead of creating new ones.

    Thanks to this flag you won't need to remember if you created a short URL for a long one. It will just create it if needed or return the existing one if possible.

    The behavior might be a little bit counterintuitive when combined with other params. This is how the endpoint behaves when providing this new flag:

    • Only the long URL is provided: It will return the newest match or create a new short URL if none is found.
    • Long url and custom slug are provided: It will return the short URL when both params match, return an error when the slug is in use for another long URL, or create a new short URL otherwise.
    • Any of the above but including other params (tags, validSince, validUntil, maxVisits): It will behave the same as the previous two cases, but it will try to exactly match existing results using all the params. If any of them does not match, it will try to create a new short URL.
  • #336 Added an API test suite which performs API calls to an actual instance of the web service.

Changed

  • #342 The installer no longer asks for a charset to be provided, and instead, it shuffles the base62 charset.
  • #320 Replaced query builder by plain DQL for all queries which do not need to be dynamically generated.
  • #330 No longer allow failures on PHP 7.3 envs during project CI build.
  • #335 Renamed functional test suite to database test suite, since that better describes what it actually does.
  • #346 Extracted installer as an independent tool.
  • #261 Increased mutation score to 70%.

Deprecated

  • #351 Deprecated config:generate-charset and config:generate-secret CLI commands.

Removed

  • Nothing

Fixed

  • #317 Fixed error while trying to generate previews because of global config file being deleted by mistake by build script.
  • #307 Fixed memory leak while trying to process huge amounts of visits due to the query not being properly paginated.

[1.15.1] - 2018-12-16

Added

  • #162 Added non-rest endpoints to swagger definition.

Changed

  • #312 Now all config files both in php and json format are loaded from config/params folder, easing users to provided customizations to docker image.
  • #226 Updated how table are rendered in CLI commands, making use of new features in Symfony 4.2.
  • #321 Extracted entities mappings from entities to external config files.
  • #308 Automated docker image building.

Deprecated

  • Nothing

Removed

Fixed

  • #309 Added missing favicon to prevent 404 errors logged when an error page is loaded in a browser.
  • #310 Fixed execution context not being properly detected, making CloseDbConnectionMiddleware to be always piped. Now the check is not even made, which simplifies everything.

[1.15.0] - 2018-12-02

Added

  • #208 Added initial support to run shlink using swoole, a non-blocking IO server which improves the performance of shlink from 4 to 10 times.

    Run shlink with ./vendor/bin/zend-expressive-swoole start to start-up the service, which will be exposed in port 8080.

    Adding the -d flag, it will be started as a background service. Then you can use the ./vendor/bin/zend-expressive-swoole stop command in order to stop it.

  • #266 Added pagination to GET /short-urls/{shortCode}/visits endpoint.

    In order to make it backwards compatible, it keeps returning all visits by default, but it now allows to provide the page and itemsPerPage query parameters in order to configure the number of items to get.

Changed

  • #267 API responses and the CLI interface is no longer translated and uses english always. Only not found error templates are still translated.
  • #289 Extracted coding standard rules to a separated package.
  • #273 Improved code coverage in repository classes.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #278 Added missing X-Api-Key header to the list of valid cross domain headers.
  • #295 Fixed custom slugs so that they are case sensitive and do not try to lowercase provided values.

[1.14.1] - 2018-11-17

Added

  • Nothing

Changed

  • #260 Increased mutation score to 65%.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #271 Fixed memory leak produced when processing high amounts of visits at the same time.
  • #272 Fixed errors produced when trying to process visits multiple times in parallel, by using a lock which ensures only one instance is run at a time.

[1.14.0] - 2018-11-16

Added

  • #236 Added option to define a redirection to a custom URL when a user hits an invalid short URL.

    It only affects URLs matched as "short URL" where the short code is invalid, not any 404 that happens in the app. For example, a request to the path /foo/bar will keep returning a 404.

    This new option will be asked by the installer both for new shlink installations and for any previous shlink version which is updated.

  • #189 and #240 Added new GeoLite2-based geolocation service which is faster and more reliable than previous one.

    It does not have API limit problems, since it uses a local database file.

    Previous service is still used as a fallback in case GeoLite DB does not contain any IP address.

Changed

  • #241 Fixed columns in visit_locations table, to be snake_case instead of camelCase.
  • #228 Updated how exceptions are serialized into logs, by using monolog's PsrLogMessageProcessor.
  • #225 Performance and maintainability slightly improved by enforcing via code sniffer that all global namespace classes, functions and constants are explicitly imported.
  • #196 Reduced anemic model in entities, defining more expressive public APIs instead.
  • #249 Added functional-php to ease collections handling.
  • #253 Increased user_agent column length in visits table to 512.
  • #256 Updated to Infection v0.11.
  • #202 Added missing response examples to OpenAPI docs.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #223 Fixed PHPStan errors produced with symfony/console 4.1.5

[1.13.2] - 2018-10-18

Added

  • #233 Added PHP 7.3 to build matrix allowing its failure.

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #237 Solved errors when trying to geo-locate null IP addresses.

    Also improved how visitor IP addresses are discovered, thanks to akrabat/ip-address-middleware package.

[1.13.1] - 2018-10-16

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #231 Fixed error when processing visits.

[1.13.0] - 2018-10-06

Added

  • #197 Added cakephp/chronos library for date manipulations.

  • #214 Improved build script, which allows builds to be done without "jumping" outside the project directory, and generates smaller dist files.

    It also allows automating the dist file generation in travis-ci builds.

  • #207 Added two new config options which are asked during installation process. The config options already existed in previous shlink version, but you had to manually set their values.

    These are the new options:

    • Visits threshold to allow short URLs to be deleted.
    • Check the visits threshold when trying to delete a short URL via REST API.

Changed

  • #211 Extracted installer to its own module, which will simplify moving it to a separated package in the future.

  • #200 and #201 Renamed REST Action classes and CLI Command classes to use the concept of ShortUrl instead of the concept of ShortCode when referring to the entity, and left the short code concept to the identifier which is used as a unique code for a specific Short URL.

  • #181 When importing the configuration from a previous shlink installation, it no longer asks to import every block. Instead, it is capable of detecting only new config options introduced in the new version, and ask only for those.

    If no new options are found and you have selected to import config, no further questions will be asked and shlink will just import the old config.

Deprecated

  • #205 Deprecated [POST /authenticate] endpoint, and allowed any API request to be automatically authenticated using the X-Api-Key header with a valid API key.

    This effectively deprecates the Authorization: Bearer <JWT> authentication form, but it will keep working.

  • As of #200 and #201 REST urls have changed from /short-codes/... to /short-urls/..., and the command namespaces have changed from short-code:... to short-url:....

    In both cases, backwards compatibility has been retained and the old ones are aliases for the new ones, but the old ones are considered deprecated.

Removed

  • Nothing

Fixed

  • #203 Fixed some warnings thrown while unzipping distributable files.
  • #206 An error is now thrown during installation if any required param is left empty, making the installer display a message and ask again until a value is set.

[1.12.0] - 2018-09-15

Added

  • #187 Included an API endpoint and a CLI command to delete short URLs.

    Due to the implicit danger of this operation, the deletion includes a safety check. URLs cannot be deleted if they have more than a specific amount of visits.

    The visits threshold is set to 15 by default and currently it has to be manually changed. In future versions the installation/update process will ask you about the value of the visits threshold.

    In order to change it, open the config/autoload/delete_short_urls.global.php file, which has this structure:

    return [
    
        'delete_short_urls' => [
            'visits_threshold' => 15,
            'check_visits_threshold' => true,
        ],
    
    ];
    

    Properties are self explanatory. Change check_visits_threshold to false to completely disable this safety check, and change the value of visits_threshold to allow short URLs with a different number of visits to be deleted.

    Once changed, delete the data/cache/app_config.php file (if any) to let shlink know about the new values.

    This check is implicit for the API endpoint, but can be "disabled" for the CLI command, which will ask you when trying to delete a URL which has reached to threshold in order to force the deletion.

  • #183 and #190 Included important documentation improvements in the repository itself. You no longer need to go to the website in order to see how to install or use shlink.

  • #186 Added a small robots.txt file that prevents 404 errors to be logged due to search engines trying to index the domain where shlink is located. Thanks to @robwent for the contribution.

Changed

  • #145 Shlink now obfuscates IP addresses from visitors by replacing the latest octet by 0, which does not affect geolocation and allows it to fulfil the GDPR.

    Other known services follow this same approach, like Google Analytics or Matomo

  • #182 The short URL creation API endpoints now return the same model used for lists and details endpoints.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #188 Shlink now allows multiple short URLs to be created that resolve to the same long URL.

[1.11.0] - 2018-08-13

Added

  • #170 and #171 Updated [GET /short-codes] and [GET /short-codes/{shortCode}] endpoints to return more meaningful information and make their response consistent.

    The short URLs are now represented by this object in both cases:

    {
        "shortCode": "12Kb3",
        "shortUrl": "https://s.test/12Kb3",
        "longUrl": "https://shlink.io",
        "dateCreated": "2016-05-01T20:34:16+02:00",
        "visitsCount": 1029,
        "tags": [
            "shlink"
        ],
        "originalUrl": "https://shlink.io"
    }
    

    The originalUrl property is considered deprecated and has been kept for backward compatibility purposes. It holds the same value as the longUrl property.

Changed

  • Nothing

Deprecated

  • The originalUrl property in [GET /short-codes] and [GET /short-codes/{shortCode}] endpoints is now deprecated and replaced by the longUrl property.

Removed

  • Nothing

Fixed

  • Nothing

[1.10.2] - 2018-08-04

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #177 Fixed [GET] /short-codes endpoint returning a 500 status code when trying to filter by tags and searchTerm at the same time.

  • #175 Fixed error introduced in previous version, where you could end up banned from the service used to resolve IP address locations.

    In order to fix that, just fill this form including your server's IP address and your server should be unbanned.

    In order to prevent this, after resolving 150 IP addresses, shlink now waits 1 minute before trying to resolve any more addresses.

[1.10.1] - 2018-08-02

Added

  • Nothing

Changed

  • #167 Shlink version is now set at build time to avoid older version numbers to be kept in newer builds.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #165 Fixed custom slugs failing when they are longer than 10 characters.

  • #166 Fixed unusual edge case in which visits were not properly counted when ordering by visit and filtering by search term in [GET] /short-codes API endpoint.

  • #174 Fixed geolocation not working due to a deprecation on used service.

  • #172 Documented missing filtering params for [GET] /short-codes/{shortCode}/visits API endpoint, which allow the list to be filtered by date range.

    For example: https://s.test/rest/v1/short-urls/abc123/visits?startDate=2017-05-23&endDate=2017-10-05

  • #169 Fixed unhandled error when parsing ShortUrlMeta and date fields are already DateTime instances.

[1.10.0] - 2018-07-09

Added

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[1.9.1] - 2018-06-18

Added

  • #155 Improved the pagination object returned in lists, including more meaningful properties.

    • Old structure:
    {
      "pagination": {
        "currentPage": 1,
        "pagesCount": 2
      }
    }
    
    • New structure:
    {
      "pagination": {
        "currentPage": 2,
        "pagesCount": 13,
        "itemsPerPage": 10,
        "itemsInCurrentPage": 10,
        "totalItems": 126
      }
    }
    

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #154 Fixed sizes of every result page when filtering by searchTerm
  • #157 Background commands executed by installation process now respect the originally used php binary

[1.9.0] - 2018-05-07

Added

  • #147 Allowed short URLs to be created on the fly using a single API request, including the API key in a query param.

    This eases integration with third party services.

    With this feature, a simple request to a URL like https://s.test/rest/v1/short-codes/shorten?apiKey=[YOUR_API_KEY]&longUrl=[URL_TO_BE_SHORTENED] would return the shortened one in JSON or plain text format.

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #139 Ensured all core actions log exceptions

[1.8.1] - 2018-04-07

Added

  • Nothing

Changed

  • #141 Removed workaround used in PathVersionMiddleware, since the bug in zend-stratigility has been fixed.

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #140 Fixed warning thrown during installation while trying to include doctrine script

[1.8.0] - 2018-03-29

Added

  • #125 Implemented a path which returns a 1px image instead of a redirection.

    Useful to track emails. Just add an image pointing to a URL like https://s.test/abc123/track to any email and an invisible image will be generated tracking every time the email is opened.

  • #132 Added infection to improve tests

Changed

  • #130 Updated to Expressive 3
  • #137 Updated symfony components to v4

Deprecated

  • Nothing

Removed

  • #131 Dropped support for PHP 7

Fixed

  • Nothing

[1.7.2] - 2018-03-26

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #135 Fixed PathVersionMiddleware being ignored when using expressive 2.2

[1.7.1] - 2018-03-21

Added

  • Nothing

Changed

  • #128 Upgraded to expressive 2.2

    This will ease the upcoming update to expressive 3

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #126 Fixed E_USER_DEPRECATED errors triggered when using Expressive 2.2

[1.7.0] - 2018-01-21

Added

  • #88 Allowed tracking of short URLs to be disabled by including a configurable query param
  • #108 Allowed metadata to be defined when creating short codes

Changed

  • #113 Updated CLI commands to use SymfonyStyle
  • #112 Enabled Lazy loading in CLI commands
  • #117 Every module which throws exceptions has now its own ExceptionInterface extending Throwable
  • #115 Added phpstan to build matrix on PHP >=7.1 envs
  • #114 Replaced vlucas/phpdotenv dev requirement by symfony/dotenv

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[1.6.2] - 2017-10-25

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #109 Fixed installation error due to typo in latest migration

[1.6.1] - 2017-10-24

Added

  • Nothing

Changed

  • #110 Created .gitattributes file to define files to be excluded from distributable package

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[1.6.0] - 2017-10-23

Added

  • #44 Now it is possible to set custom slugs for short URLs instead of using a generated short code
  • #47 Allowed to limit short URLs availability by date range
  • #48 Allowed to limit the number of visits to a short URL
  • #105 Added option to enable/disable URL validation by response status code

Changed

  • #27 Added repository functional tests with dbunit
  • #101 Now specific actions just capture very specific exceptions, and let the ErrorHandler catch any other unhandled exception
  • #104 Used different templates for requested-short-code-does-not-exist and route-could-not-be-match
  • #99 Replaced usages of AnnotatedFactory by ConfigAbstractFactory
  • #100 Updated templates engine. Replaced twig by plates
  • #102 Improved coding standards strictness

Deprecated

  • Nothing

Removed

  • #86 Dropped support for PHP 5

Fixed

  • #103 NotFoundDelegate now returns proper content types based on accepted content

[1.5.0] - 2017-07-16

Added

  • #95 Added tags CRUD to CLI
  • #59 Added tags CRUD to REST
  • #66 Allowed certain information to be imported from and older shlink instance directory when updating

Changed

  • #96 Added namespace to functions
  • #76 Added response examples to swagger docs
  • #93 Improved cross domain management by using the ImplicitOptionsMiddleware

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #92 Fixed formatted dates, using an ISO compliant format

[1.4.0] - 2017-03-25

Added

  • Nothing

Changed

  • #89 Updated to expressive 2

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[1.3.1] - 2017-01-22

Added

  • Nothing

Changed

  • #82 Enabled FastRoute routes cache
  • #85 Updated year in license file
  • #81 Added docker containers config

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #83 Fixed short codes list: search in tags when filtering by query string
  • #79 Increased the number of followed redirects
  • #75 Applied PathVersionMiddleware only to rest routes defining it by configuration instead of code
  • #77 Allowed defining database server hostname and port

[1.3.0] - 2016-10-23

Added

  • #67 Allowed to order the short codes list
  • #60 Accepted JSON requests in REST and used a body parser middleware to set the request's parsedBody
  • #72 When listing API keys from CLI, use yellow color for enabled keys that have expired
  • #58 Allowed to filter short URLs by tag
  • #69 Allowed to filter short URLs by text query
  • #73 Added tag-related endpoints to swagger file
  • #63 Added path versioning to REST API routes

Changed

  • #71 Separated swagger docs into multiple files

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing

[1.2.2] - 2016-08-29

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Fixed minor bugs on CORS requests

[1.2.1] - 2016-08-21

Added

  • Nothing

Changed

  • Nothing

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #62 Fixed cross-domain requests in REST API

[1.2.0] - 2016-08-21

Added

  • #45 Allowed to define tags on short codes, to improve filtering and classification
  • #7 Added website previews while listing available URLs
  • #57 Added database migrations system to improve updating between versions
  • #31 Added support for other database management systems by improving the EntityManager factory
  • #51 Generated build process to create app package and ease distribution
  • #38 Defined installation script. It will request dynamic data on the fly so that there is no need to define env vars
  • #55 Created update script which does not try to create a new database

Changed

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #53 Fixed entities database interoperability
  • #52 Added missing htaccess file for apache environments

[1.1.0] - 2016-08-09

Added

  • #46 Defined a route that returns a QR code representing the shortened URL.

    In order to get the QR code URL, use a pattern like https://s.test/abc123/qr-code

  • #32 Added support for other cache adapters by improving the Cache factory

  • #14 Added logger and enabled errors logging

  • #13 Improved REST authentication

Changed

  • #41 Cached the "short code" => "URL" map to prevent extra DB hits
  • #39 Changed copyright from "Alejandro Celaya" to "Shlink" in error pages
  • #42 REST endpoints that need to find something now return a 404 when it is not found
  • #35 Updated CLI commands to use the same PHP namespace as the one used for the command name

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • #40 Taken into account the X-Forwarded-For header in order to get the visitor information, in case the server is behind a load balancer or proxy

[1.0.0] - 2016-08-01

Added

  • #33 Created a command that generates a short code charset by randomizing the default one
  • #23 Translated application literals
  • #21 Allowed to filter visits by date range
  • #4 Added installation steps
  • #12 Improved code coverage

Changed

  • #15 HTTP requests now return JSON/HTML responses for errors (4xx and 5xx) based on Accept header
  • #22 Now visits locations data is saved on a visit_locations table
  • #20 Injected cross domain headers in response only if the Origin header is present in the request
  • #11 Separated code into multiple modules
  • #18 Grouped routable middleware in an Action namespace
  • #6 Project no longer depends on zendframework/zend-expressive-helpers package
  • #30 Replaced the "services" first level config entry by "dependencies", in order to fulfill default Expressive naming
  • #25 Replaced "Middleware" suffix on routable middlewares by "Action"
  • #19 Changed the vendor and app namespace from Acelaya\UrlShortener to Shlinkio\Shlink

Deprecated

  • Nothing

Removed

  • #36 Removed hhvm from the CI matrix since it doesn't support array constants and will fail

Fixed

  • #24 Prevented duplicated short codes errors because of the case insensitive behavior on MySQL

[0.2.0] - 2016-08-01

Added

  • #8 Created a REST API
  • #10 Added more CLI functionality
  • #5 Created a CHANGELOG file

Changed

  • #9 Used symfony/console to dispatch console requests, instead of trying to integrate the process with expressive

Deprecated

  • Nothing

Removed

  • Nothing

Fixed

  • Nothing