{"id":22319451,"url":"https://github.com/in2code-de/ipandlanguageredirect","last_synced_at":"2026-01-15T22:18:29.262Z","repository":{"id":12688663,"uuid":"67796292","full_name":"in2code-de/ipandlanguageredirect","owner":"in2code-de","description":"TYPO3 redirect - browserlanguage and ip-address based","archived":false,"fork":false,"pushed_at":"2026-01-12T04:14:29.000Z","size":2422,"stargazers_count":14,"open_issues_count":7,"forks_count":16,"subscribers_count":6,"default_branch":"typo3_13","last_synced_at":"2026-01-13T04:06:25.300Z","etag":null,"topics":["frontend-language","ip","redirect","typo3","typo3-cms-extension"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/in2code-de.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-09-09T12:15:53.000Z","updated_at":"2025-08-07T14:17:05.000Z","dependencies_parsed_at":"2026-01-13T04:06:35.917Z","dependency_job_id":null,"html_url":"https://github.com/in2code-de/ipandlanguageredirect","commit_stats":{"total_commits":162,"total_committers":11,"mean_commits":"14.727272727272727","dds":"0.31481481481481477","last_synced_commit":"3245fdde2926292c4a175090fc24c4d24a1008ef"},"previous_names":["in2code-de/ipandlanguageredirect","einpraegsam/ipandlanguageredirect"],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/in2code-de/ipandlanguageredirect","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/in2code-de%2Fipandlanguageredirect","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/in2code-de%2Fipandlanguageredirect/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/in2code-de%2Fipandlanguageredirect/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/in2code-de%2Fipandlanguageredirect/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/in2code-de","download_url":"https://codeload.github.com/in2code-de/ipandlanguageredirect/tar.gz/refs/heads/typo3_13","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/in2code-de%2Fipandlanguageredirect/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28472625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T22:13:38.078Z","status":"ssl_error","status_checked_at":"2026-01-15T22:12:11.737Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["frontend-language","ip","redirect","typo3","typo3-cms-extension"],"created_at":"2024-12-04T00:09:07.761Z","updated_at":"2026-01-15T22:18:29.256Z","avatar_url":"https://github.com/in2code-de.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TYPO3 Extension ipandlanguageredirect\nTYPO3 FE visitor automatic or manual redirect to another language or another root page.\n\n## Introduction\n\nThis extension allows **multi-language** and **multi-domain** handling with redirects to best fitting pages with best\nfitting language based on the visitors browser language and region (IP-Address).\n\nAn AJAX-request (VanillaJS only - no JavaScript framework is needed) will handle the serverside-domain-logic to redirect\nor suggest a new webpage or a new language.\n\nDefine in your PHP-configuration which countries belongs to which pagetree and which browserlanguage belongs to which\nfrontend language\n\n### In short words\n\nAutomaticly **redirect** or **show a note** for the visitor to give him the best fitting website version for his/her needs.\n\n### Screens\n\nExample suggest message in frontend:\n![Suggest a language](Documentation/Images/screenshot-frontend-suggest.png \"Suggest a language\")\n\n### Which way is used to get the country code of the user?\n\nThis is completely your choice now. You can choose between different ip2country service classes.\nThere is a local table with ip-ranges and countries on the one hand and on the other hand, you can also use external services\nto convert the visitors ip to a countryCode. While the first methods respects all privacy the second method is more current\nof course.\n\nOr: You can combine different methods: Because the service of IpApi is for free for 1000 requests a month, you can use\nthis and in addition the offline-table variant.\n\nAvailable classes per default:\n\n* `In2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\IpApi` - This uses the external service of ipapi.co to convert IP-addresses to a country code. Note: You can set the api key via TypoScript if you want to use more then 1000 requests a month\n* `In2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\LocalDatabase` - This uses the local database table `tx_ipandlanguageredirect_domain_model_iptocountry` to convert the ip address to a country - no external service, most privacy\n* `In2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\IpApiCom` - This uses the external service of ip-api.com to convert IP-addresses to a country code. Attention: Because https is not possible by this service all request are handled over port 80\n\nGo to the extension manager settings and choose the classes that you want to use or simply add your own service. Example\nstring in the extension manager settings for `ipToCountryService` could be\n`In2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\IpApi,In2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\LocalDatabase`\nto use the service of IpApi as long as it is free and then fall back to the local database.\n\n### What's the difference to other extensions like rmpl_language_detect?\n\nThere is a basic difference in the concept. While most of the language-redirect extensions hook into the page rendering\nprocess via USER_INT, we choose an ansynchronical way with JavaScript and PHP (AJAX). This solution needs JavaScript on\nthe one hand but is much faster for high availability and more complex websites on the other hand. This means:\nYou can use e.g. [staticfilecache](https://github.com/lochmueller/staticfilecache) or another static solution to improve\nweb performance. While it's not possible to use staticfilecache with a USER_INT, which is included on every single page.\n\n### Testing!\n\nThis extension allows you to test how your website will react if a visitor from a different country checks out your\nwebsite. See below for a lot of testings possibilities.\n\n## Installation\n\n* Install this extension\n* Add a static template (page.5 will be used for the suggest container, page.1555 for the script)\n* Copy the original configuration from ipandlanguageredirect/Configuration/Redirect/Redirect.php to any other location\n* Modify the configuration for your needs\n* Set the new path in the extension manager to your configuration file\n* Have fun!\n\n## Example configuration\n\n```\n\u003c?php\nreturn [\n    // Example action\n    'actions' =\u003e [\n        [\n            // Automatic redirect to best fitting uri if visitor comes from a search engine\n            'referrers' =\u003e [\n                'google.',\n                'bing.',\n                'yahoo.',\n                't-online.',\n                'yandex.',\n                'baidu.'\n            ],\n            'events' =\u003e [\n                'redirect'\n            ]\n        ],\n        [\n            // For all other cases: Suggest a better fitting page\n            'referrers' =\u003e [\n                '*'\n            ],\n            'events' =\u003e [\n                'suggest'\n            ]\n        ],\n        [\n            // Disable redirect for pages inside the given pid\n            'pidInRootline' =\u003e [\n                '129',\n                '11',\n            ],\n            'events' =\u003e [\n                'none',\n            ],\n        ],\n        [\n            // Prevent redirect for google pagespeed access\n            'userAgent' =\u003e [\n                'Chrome-Lighthouse'\n            ],\n            'events' =\u003e [\n                'none'\n            ]\n        ],\n    ],\n    'globalConfiguration' =\u003e [\n        // don't show suggest or redirect on a subpage\n        'actionOnHomeOnly' =\u003e false,\n\n        // always redirect to the home-page, don not try to stay on the same page while changing the language\n        'stayOnCurrentPage' =\u003e false\n    ],\n    // configuration if nothing matches\n    'noMatchingConfiguration' =\u003e [\n        'identifierUsage' =\u003e 'worldwide_english',\n        'matchMinQuantifier' =\u003e 15\n    ],\n    // main redirect configuration\n    'redirectConfiguration' =\u003e [\n\n        // Build URI to page 1 if visitors came from anywhere in the world\n        1 =\u003e [\n\n            // Build URI to language 0 if browser language is not defined here\n            0 =\u003e [\n                'identifier' =\u003e 'worldwide_english',\n                'domain' =\u003e [\n                    'www.domain.com',\n                    'test.domain.org'\n                ],\n                'browserLanguage' =\u003e [\n                    '*'\n                ],\n                'countryBasedOnIp' =\u003e [\n                    '*'\n                ]\n            ],\n\n            // Build URI to language 1 if browser language is german \"de\"\n            1 =\u003e [\n                'identifier' =\u003e 'worldwide_german',\n                'domain' =\u003e [\n                    'www.domain.com',\n                    'test.domain.org'\n                ],\n                'browserLanguage' =\u003e [\n                    'de'\n                ],\n                'countryBasedOnIp' =\u003e [\n                    '*'\n                ]\n            ],\n\n            // Build URI to language 2 if browser language is chinese \"zh\"\n            2 =\u003e [\n                'identifier' =\u003e 'worldwide_chinese',\n                'domain' =\u003e [\n                    'www.domain.com',\n                    'test.domain.org'\n                ],\n                'browserLanguage' =\u003e [\n                    'zh'\n                ],\n                'countryBasedOnIp' =\u003e [\n                    '*'\n                ]\n            ],\n        ],\n\n        // Build URI to page 2 if visitors came from USA, Canada or Argentina\n        2 =\u003e [\n\n            // Build URI to language 0 if browser language is not defined here\n            0 =\u003e [\n                'identifier' =\u003e 'america_english',\n                'domain' =\u003e [\n                    'www.seconddomain.org',\n                    'test.seconddomain.org'\n                ],\n                'browserLanguage' =\u003e [\n                    '*'\n                ],\n                'countryBasedOnIp' =\u003e [\n                    'ca',\n                    'us',\n                    'ar',\n                ]\n            ],\n\n            // Build URI to language 1 if browser language is german \"de\"\n            1 =\u003e [\n                'identifier' =\u003e 'worldwide_german',\n                'domain' =\u003e [\n                    'www.seconddomain.org',\n                    'test.seconddomain.org'\n                ],\n                'browserLanguage' =\u003e [\n                    'de'\n                ],\n                'countryBasedOnIp' =\u003e [\n                    '*'\n                ]\n            ],\n        ],\n    ],\n    // Quantifiers for the matches (shouldn't be touched)\n    'quantifier' =\u003e [\n        'browserLanguage' =\u003e [\n            'totalMatch' =\u003e 7,\n            'wildCardMatch' =\u003e 3\n        ],\n        'countryBasedOnIp' =\u003e [\n            'totalMatch' =\u003e 13,\n            'wildCardMatch' =\u003e 5\n        ],\n        'domain' =\u003e [\n            'totalMatch' =\u003e 10,\n            'wildCardMatch' =\u003e 4\n        ],\n        'actions' =\u003e [\n            'referrers' =\u003e [\n                'totalMatch' =\u003e 7,\n                'wildCardMatch' =\u003e 3,\n            ],\n            'userAgents' =\u003e [\n                'totalMatch' =\u003e 7,\n                'wildCardMatch' =\u003e 3,\n            ],\n            'pidInRootline' =\u003e 9999\n        ]\n    ]\n];\n```\n\n## TypoScript\n\nIf you add the static TypoScript, this lines have an effect:\n\n```\nplugin.tx_ipandlanguageredirect {\n\tview {\n\t\ttemplateRootPaths {\n\t\t\t0 = EXT:ipandlanguageredirect/Resources/Private/Templates/\n\t\t\t1 = {$plugin.tx_ipandlanguageredirect.view.templateRootPath}\n\t\t}\n\t}\n\tfeatures.requireCHashArgumentForActionArguments = 0\n\n\tsettings {\n\t\t# Add configuration to your IpToCountry service classes\n\t\tipToCountry {\n\t\t\tIn2code\\Ipandlanguageredirect\\Domain\\Service\\IpToCountry\\IpApi {\n\t\t\t\t# IpApi Key: Please enter your key for ipapi.co (optional), otherwise extension will have limited access to the service (less then 1000 visitors a day). See ipapi.co for details.\n\t\t\t\tipApiKey =\n\t\t\t}\n\t\t}\n\t}\n}\n\npage {\n\tincludeJSFooter.ipandlanguageredirect = EXT:ipandlanguageredirect/Resources/Public/JavaScripts/Frontend.min.js\n\tincludeCSS.ipandlanguageredirect = EXT:ipandlanguageredirect/Resources/Public/Css/Frontend.min.css\n\n\t# Suggest container that can be slided down\n\t5 = USER\n\t5 {\n\t\tuserFunc = TYPO3\\CMS\\Extbase\\Core\\Bootstrap-\u003erun\n\t\textensionName = Ipandlanguageredirect\n\t\tpluginName = Pi1\n\t\tvendorName = In2code\n\t\tcontroller = Redirect\n\t\taction = suggest\n\t\tswitchableControllerActions.Redirect.1 = suggest\n\t}\n\n\t# Container for informations that will be send to an AJAX service\n\t1555 = COA\n\t1555 {\n\t\twrap = \u003cscript id=\"ipandlanguageredirect_container\"|\u003e\u003c/script\u003e\n\n\t\t# Uri to send AJAX request to\n\t\t10 = TEXT\n\t\t10 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-ajaxuri=\"|\"|\n\t\t\ttypolink {\n\t\t\t\tparameter.data = TSFE:id\n\t\t\t\tadditionalParams = \u0026type=1555\n\t\t\t\treturnLast = url\n\t\t\t\tforceAbsoluteUrl = 1\n\t\t\t}\n\t\t}\n\n\t\t# FE language\n\t\t20 = TEXT\n\t\t20 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-languageuid=\"|\"|\n\t\t\tdata = sitelanguage:languageId\n\t\t\tifEmpty.data = GP:L\n\t\t\tintval = 1\n\t\t}\n\n\t\t# Root page uid\n\t\t30 = TEXT\n\t\t30 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-rootpageuid=\"|\"|\n\t\t\tdata = leveluid:0\n\t\t}\n\n\t\t# Fake browser language for testing - e.g. \u0026tx_ipandlanguageredirect_pi1[browserLanguage]=en\n\t\t40 = TEXT\n\t\t40 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-browserlanguage=\"|\"|\n\t\t\tdata = GP:tx_ipandlanguageredirect_pi1|browserLanguage\n\t\t\thtmlSpecialChars = 1\n\t\t\trequired = 1\n\t\t}\n\n\t\t# Fake ip-address for testing - e.g. \u0026tx_ipandlanguageredirect_pi1[ipAddress]=66.85.131.18 (USA)\n\t\t50 = TEXT\n\t\t50 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-ipaddress=\"|\"|\n\t\t\tdata = GP:tx_ipandlanguageredirect_pi1|ipAddress\n\t\t\thtmlSpecialChars = 1\n\t\t\trequired = 1\n\t\t}\n\n\t\t# Fake country for testing (overlays ip-address) - e.g. \u0026tx_ipandlanguageredirect_pi1[countryCode]=us (USA)\n\t\t60 = TEXT\n\t\t60 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-countrycode=\"|\"|\n\t\t\tdata = GP:tx_ipandlanguageredirect_pi1|countryCode\n\t\t\thtmlSpecialChars = 1\n\t\t\trequired = 1\n\t\t}\n\n\t\t# Fake referrer for testing - e.g. \u0026tx_ipandlanguageredirect_pi1[referrer]=www.google.de\n\t\t70 = TEXT\n\t\t70 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-referrer=\"|\"|\n\t\t\tdata = GP:tx_ipandlanguageredirect_pi1|referrer\n\t\t\thtmlSpecialChars = 1\n\t\t\trequired = 1\n\t\t}\n\n\t\t# Fake domain for testing - e.g. \u0026tx_ipandlanguageredirect_pi1[domain]=www.production.org\n\t\t80 = TEXT\n\t\t80 {\n\t\t\tnoTrimWrap = | data-ipandlanguageredirect-domain=\"|\"|\n\t\t\tdata = GP:tx_ipandlanguageredirect_pi1|domain\n\t\t\thtmlSpecialChars = 1\n\t\t\trequired = 1\n\t\t}\n\t}\n}\n\n# AJAX types\nredirectAjax = PAGE\nredirectAjax {\n\ttypeNum = 1555\n\tconfig {\n\t\tadditionalHeaders = Content-Type: application/json\n\t\tadditionalHeaders.10.header = Content-Type: application/json\n\t\tno_cache = 1\n\t\tdisableAllHeaderCode = 1\n\t\tdisablePrefixComment = 1\n\t\txhtml_cleaning = 0\n\t\tadmPanel = 0\n\t\tdebug = 0\n\t}\n\n\t10  = USER\n\t10 {\n\t\tuserFunc = TYPO3\\CMS\\Extbase\\Core\\Bootstrap-\u003erun\n\t\textensionName = Ipandlanguageredirect\n\t\tpluginName = Pi1\n\t\tvendorName = In2code\n\t\tcontroller = Redirect\n\t\taction = redirect\n\t\tswitchableControllerActions.Redirect.1 = redirect\n\t}\n}\ntestAjax \u003c redirectAjax\ntestAjax {\n\ttypeNum = 1556\n\t10.action = test\n\t10.switchableControllerActions.Redirect.1 = test\n}\n```\n\n## Testing\n\n### Simulate browserlanguage, country and referrer\n\n```\nhttp://domain.org/index.php?id=1\n\u0026tx_ipandlanguageredirect_pi1[ipAddress]=66.85.131.18\n\u0026tx_ipandlanguageredirect_pi1[browserLanguage]=de\n\u0026tx_ipandlanguageredirect_pi1[referrer]=www.google.de\n\u0026tx_ipandlanguageredirect_pi1[countryCode]=af\n\u0026tx_ipandlanguageredirect_pi1[domain]=www.domain.org\n\u0026no_cache=1\n```\nNote: Be aware that this settings are cached by default. So you have to always add a \u0026no_cache=1\n\n### Don't redirect or suggest but show the redirectUri in the browserconsole\n\n```\nhttp://domain.org/index.php?id=1\n\u0026ipandlanguagedebug=1\n```\n\nExample answer from your server:\n```\n{\n  \"redirectUri\": \"https:\\/\\/local.domain.org\\/de\\/\",\n  \"activated\": true,\n  \"events\": [\n    \"redirect\"\n  ],\n  \"activatedReasons\": {\n    \"differentLanguages\": true,\n    \"differentRootpages\": false\n  },\n  \"country\": \"jp\",\n  \"givenParameters\": {\n    \"browserLanguage\": \"de\",\n    \"referrer\": \"www.google.de\",\n    \"ipAddress\": \"27.121.255.4\",\n    \"languageUid\": 0,\n    \"rootpageUid\": 209,\n    \"countryCodeOverlay\": \"\",\n    \"domain\": \"local.domain.org\"\n  }\n}\n```\n\n## FAQ\n\n* Hide Suggest Message\n  * Q1: How to disable the suggest message on click on one of my own links?\n  * A1: You could add links or other dom elements with attribute **data-ipandlanguageredirect-action=\"hideMessage\"** anywhere\n    on your page to disable the suggest message.\n    Use case: If the user changes the region or language manually on your site, the message should be dissapear in\n    future.\n  * Q2: How to disable the suggest message with a GET parameter?\n  * A2: The message will be hidden and the cookie to hide it will be set if the GET parameter **\u0026h=1** or **\u0026h=3** is given\n* Disable redirect\n  * Q1: How to disable the redirect on click on one of my own links?\n  * A1: You could add links or other dom elements with attribute **data-ipandlanguageredirect-action=\"disableRedirect\"** anywhere\n    on your page to disable redirect.\n  * Q2: How to disable the redirect with a GET parameter?\n  * A2: The redirect will be disabled by settings a cookie if the GET parameter **\u0026h=2** or **\u0026h=3** is given\n* Cookie Livetime\n  * The default cookie livetime is temporarely - as long as the browser is open. This is not adjustable at the moment.\n* Testing\n  * Q1: How can I test another IP-address, region or browserlanguage?\n  * A1: See part testing\n  * Q2: Where can I see which parameters are send and received via AJAX?\n  * A2: Open your browser console and check the post request to ?type=1555 - check the parameters or answers\n* Typenum will not work\n  * Q1: In TYPO3 9 or higher my requests won't work - what can I do?\n  * Q1: You have to define the used type param in your routing configuration (see following example)\n\nRouting example:\n\n```\nrouteEnhancers:\n    PageTypeSuffix:\n        type: PageType\n        map:\n            redirect.json: 1555\n```\n\n## Your Contribution\n\n**Pull requests** are welcome in general! Nevertheless please don't forget to add a description to your pull requests. This\nis very helpful to understand what kind of issue the **PR** is going to solve.\n\n- Bugfixes: Please describe what kind of bug your fix solve and give me feedback how to reproduce the issue. I'm going\nto accept only bugfixes if I can reproduce the issue.\n- Features: Not every feature is relevant for the bulk of extension users. Please discuss a new feature before.\n\n### Contribution with ddev\n\n#### Requirements\n\n1. Install ddev, see: https://ddev.readthedocs.io/en/stable/#installation\n2. Install git-lfs, see: https://git-lfs.github.com/\n\n#### Installation\n\n1. Clone this repository\n2. Run `ddev start`\n3. Run `ddev initialize` to setup configurations and test database\n\n#### Branchinfo\n\n* Main Branch - Next Major Version\n* typo3-v13: Version V13 for TYPO3 13\n\n## What's not (yet?) possible at the moment\n\n* Make wildcard usage available in browserlanguage (like \"en*\" for all english browserlanguages)\n* Support all browserlanguages and not only the first one\n* Support also continents\n\n## Early Access Programm for TYPO3 14 support\n\n:information_source: **TYPO3 14 compatibility**\n\u003e See [EAP page (DE)](https://www.in2code.de/agentur/typo3-extensions/early-access-programm/) or\n\u003e [EAP page (EN)](https://www.in2code.de/en/agency/typo3-extensions/early-access-program/) for more information how\n\u003e to get access to a TYPO3 14 version\n\n\n## Changelog\n\n| Version   | Date       | State    | Description                                                                | Note                      |\n|-----------|------------|----------|----------------------------------------------------------------------------|---------------------------|\n| 13.0.0    | 2025-08-07 | Feature  | TYPO3 v13 compatibility                                                    |                           |\n| 5.2.2     | 2025-01-10 | Task     | Logging adjustments and small bugfixes                                     |                           |\n| 5.2.1     | 2023-04-23 | Bugfix   | Bugfix for correct constraints                                             |                           |\n| 5.2.0     | 2023-04-20 | Feabure  | Support for TYPO3 12                                                       |                           |\n| 5.1.2     | 2023-06-12 | Security | Fix a possible SQL injection                                               |                           |\n| 5.1.1     | 2023-02-07 | Bugfix   | Fixed undefined array key exception in PHP 8                               |                           |\n| 5.1.0     | 2022-07-12 | Task     | Css and frontend toolchain update                                          |                           |\n| 5.0.0     | 2022-04-08 | Task     | Update for TYPO3 11 (9 and 10 support is dropped now)                      |                           |\n| 4.0.1     | 2021-11-22 | Task     | Define extension key in composer.json file                                 |                           |\n| 4.0.0     | 2020-12-31 | Task     | Update for TYPO3 9 and 10                                                  |                           |\n| 3.1.0     | 2020-02-07 | Task     | Small update: Move ext icon to Public, clean composer.json, doc update     |                           |\n| 3.0.1     | 2019-08-06 | Bugfix   | Don't use a configuration of a wrong rootpage                              |                           |\n| 3.0.0 !!! | 2019-07-05 | Feature  | Do actions based on user agent (disable redirect for google page speed)    | Update your configuration |\n| 2.2.0     | 2019-04-26 | Task     | Support language handling in TYPO3 9, small documentation fixes            |                           |\n| 2.1.0     | 2019-01-10 | Task     | Small cleanup, small text changes                                          |                           |\n| 2.0.0 !!! | 2018-10-18 | Feature  | Multi domain handling, actionOnHomeOnly, offline ip2geo, stayOnCurrentPage | Update your configuration |\n| 1.8.0     | 2018-08-23 | Task     | Add extension icon, add some documentation                                 |                           |\n| 1.7.2     | 2018-01-21 | Task     | Allow ipapi key now without \u0026key=                                          |                           |\n| 1.7.1     | 2018-01-16 | Bugfix   | Don't send \"null\" for an IP-address value if not testvalue is given        |                           |\n| 1.7.0     | 2017-09-25 | Feature  | Support paid variant of IpApi.co for more then 1000 visitors a day         |                           |\n| 1.6.4     | 2017-08-11 | Bugfix   | Fix header output in TYPO3 8                                               |                           |\n| 1.6.3     | 2017-07-28 | Bugfix   | Disable cHash check for AJAX requests in T3 8                              |                           |\n| 1.6.2     | 2017-07-12 | Bugfix   | Fix small typo in composer.json                                            |                           |\n| 1.6.1     | 2017-04-12 | Bugfix   | Fix getting browserlanguage from chrome                                    |                           |\n| 1.6.0     | 2017-02-04 | Feature  | Redirection should be only once in a session                               |                           |\n| 1.5.3     | 2017-02-01 | Bugfix   | Make code readable for PHP 5.5                                             |                           |\n| 1.5.2     | 2017-01-31 | Task     | Remove unused typoscript                                                   |                           |\n| 1.5.1     | 2017-01-26 | Bugfix   | Avoid JS exception if state == none                                        |                           |\n| 1.5.0     | 2017-01-25 | Feature  | New option to disable functions for a pagetree                             |                           |\n| 1.4.1     | 2016-11-15 | Task     | Semantic code cleanup for HTML and CSS                                     |                           |\n| 1.4.0     | 2016-11-15 | Feature  | Semantic code cleanup for HTML and CSS                                     |                           |\n| 1.3.0     | 2016-11-07 | Feature  | Hide suggest message on GET parameter                                      |                           |\n| 1.2.0     | 2016-11-03 | Feature  | Allow hideMessage on multi-links now                                       |                           |\n| 1.1.0     | 2016-11-01 | Feature  | Add testing features                                                       |                           |\n| 1.0.0     | 2016-11-01 | Initial  | Initial release                                                            |                           |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fin2code-de%2Fipandlanguageredirect","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fin2code-de%2Fipandlanguageredirect","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fin2code-de%2Fipandlanguageredirect/lists"}