terminal42 / contao-geoip2-country
使用MaxMind GeoIP2数据库检测访客的国家并在Contao中保护元素
Requires
- php: ^8.1
- contao/core-bundle: ^4.13 || ^5.0
- doctrine/dbal: ^2.11 || ^3.0
- geoip2/geoip2: ~2.0
Requires (Dev)
- contao/manager-plugin: ^2.9
- friendsofsymfony/http-cache: ^2.6
- terminal42/contao-build-tools: dev-main
Conflicts
- contao/manager-plugin: <2.9 || >=3.0
- friendsofsymfony/http-cache: <2.6 || >=3.0
README
本Contao扩展可从客户端IP地址中找到国家。然后可以根据此信息自定义网站。
此扩展需要MaxMind GeoIP2数据库,可以是GeoIP2 Country或GeoLite2 Country数据库。请注意,根据您的使用情况,您可能需要此产品的商业许可!
特性
-
基于用户国家限制内容
默认情况下,可以为国家设置页面、文章、内容元素和前端模块的可见性。对于每个内容,您可以选择仅显示给特定国家或从国家列表中隐藏。 -
Symfony HTTP反向代理
集成对Symfony HTTP反向代理的支持,允许使用Vary
头部为每个国家缓存页面。如果没有支持的代理,具有特定国家内容的响应将自动设置为Cache-Control: private
。在Contao Managed Edition中将自动为您配置此功能。
-
成员的默认国家
将检测到的国家设置为新成员的默认国家,因此注册前端模块已预先选择国家。 -
支持
terminal42/contao-countryselect
如果将countryselect
表单字段添加到表单中,则默认选项将自动设置为访客的国家。
关于页面可见性的说明
如果配置了根页面的可见性,它也会影响所有子页面。这意味着如果根页面对某个国家不可用,则此树中的所有页面都将不可用。
在备用根页面上启用此功能可能会导致不希望的结果,因为如果首选语言中没有匹配的,用户将不会被重定向到任何页面!
安装
选择与您的流程相匹配的安装方法!
通过Contao Manager安装
在Contao Manager中搜索terminal42/contao-geoip2-country
,并将其添加到您的安装中。最后,更新包。
手动安装
为此包添加一个composer依赖项。因此,在项目根目录中更改并运行以下命令
composer require terminal42/contao-geoip2-country
根据您的环境,命令可能不同,即如果您未全局安装composer,则从php composer.phar …
开始。
然后,通过contao:migrate
命令或Contao安装工具更新数据库。
HTTP反向代理
如果您不使用Contao Managed Edition,则可以使用包括friendsofsymfony/http-cache
在内的Symfony反向代理手动注册CacheHeaderSubscriber。
配置
MaxMind GeoIP2数据库
安装二进制MMDB文件,并在GEOIP2_DATABASE
环境变量中配置其路径(例如,通过您的.env
/.env.local
文件)。
包配置
默认配置
terminal42_geoip2_country: database_path: %env(GEOIP2_DATABASE)% fallback_country: XX dca_tables: [tl_content, tl_article, tl_module, tl_page]
-
database_path: MMDB文件的路径。默认为
GEOIP2_DATABASE
环境变量。请注意,此设置不适用于HTTP反向代理! -
fallback_country: 当无法检测访客IP时默认的国家(例如,也适用于本地主机)。XX是联合国对未知国家的标准,但通过输入有效的ISO 3166-1 alpha-2代码,未知访客将看到特定内容。
-
dca_tables: 配置哪些元素允许国家限制。更改此设置将把DCA字段添加到指定的表(s),但除了默认表之外,您还需要实现自己的可见性检查!
更新MaxMind GeoIP2数据库
从IP地址检测国家需要最新的信息源,因为IP地址不断变化。我们建议使用MaxMind的自动更新支持来保持您的数据库最新。
获取当前用户的所在国家
要在自己的代码中检索当前国家,请将Terminal42\Geoip2CountryBundle\CountryProvider
服务注入到您的类中。然后使用getCurrentCountry
方法,并将请求对象传递给它。
在Contao AbstractFrontendModule
控制器中的示例
<?php namespace App\Controller; use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController; use Contao\CoreBundle\Twig\FragmentTemplate; use Contao\ModuleModel; use Symfony\Component\HttpFoundation\Request; use Terminal42\Geoip2CountryBundle\CountryProvider; class FooController extends AbstractFrontendModuleController { public function __construct( private readonly CountryProvider $countryProvider ) { } public function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response { // Only show content to Switzerland if ('CH' !== $this->countryProvider->getCurrentCountry($request)) { return new Response(); } return $template->getResponse(); } }
谢谢!
感谢Burki & Scherer AG (@Tsarma)对原始实现和开发的支持。
许可证
此软件包根据MIT许可证发布。