terminal42/contao-geoip2-country

使用MaxMind GeoIP2数据库检测访客的国家并在Contao中保护元素

资助包维护!
terminal42
其他

安装: 886

依赖: 1

建议者: 3

安全: 0

星星: 5

观察者: 5

分支: 1

开放问题: 0

类型:contao-bundle

1.3.4 2024-08-20 14:39 UTC

This package is auto-updated.

Last update: 2024-09-06 08:40:21 UTC


README

本Contao扩展可从客户端IP地址中找到国家。然后可以根据此信息自定义网站。

此扩展需要MaxMind GeoIP2数据库,可以是GeoIP2 CountryGeoLite2 Country数据库。请注意,根据您的使用情况,您可能需要此产品的商业许可!

特性

  1. 基于用户国家限制内容
    默认情况下,可以为国家设置页面、文章、内容元素和前端模块的可见性。对于每个内容,您可以选择仅显示给特定国家或从国家列表中隐藏。

  2. Symfony HTTP反向代理
    集成对Symfony HTTP反向代理的支持,允许使用Vary头部为每个国家缓存页面。如果没有支持的代理,具有特定国家内容的响应将自动设置为Cache-Control: private

    在Contao Managed Edition中将自动为您配置此功能。

  3. 成员的默认国家
    将检测到的国家设置为新成员的默认国家,因此注册前端模块已预先选择国家。

  4. 支持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许可证发布。