【发布时间】:2021-06-20 02:28:46
【问题描述】:
我已经实现了 AMP 电子邮件,所以当客户端通过 amp-form 从电子邮件正文内部提交任何数据时,请求会发送到谷歌,谷歌会通过 HTTP 请求将数据提交到我的服务器,但当 AMP 请求发送到我的服务器来自 Google 服务器而不是客户端的浏览器,我无法通过普通的 PHP $_SERVER 变量获取客户端的 IP。
AMP EMAILS 是否有任何解决方法,我可以通过它在我的 PHP Apache 后端中获取客户端的 IP?
以下是我目前用来获取 IP 的代码,但无法在任何 $_SERVER 键中获取客户端 IP:
function get_ip_address()
{
$str="";
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
if (array_key_exists($key, $_SERVER) === true)
{
foreach (explode(',', $_SERVER[$key]) as $ip)
{
$ip = trim($ip); // just to be safe
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false)
{
$str .= $key." => ".$ip." ";;
}
}
}
}
return $str;
}
编辑: 根据Su Zhang 对his answer 的评论,由于隐私问题,我们无法获取用户的IP,因此我可以根据客户端的地理位置获取附近IP 的解决方案/解决方法也适用于我。
【问题讨论】:
-
您必须首先将客户端 IP 放入表单的某个字段中,以便 Google 将数据传递到您的服务器时,您可以在其中找到它。
-
@CBroe , 即使我在我的
amp-form中创建一个字段,如何在提交表单时将这个字段填充为客户的IP? -
您需要服务器端代码,首先确定客户端 IP(基本上,您已经拥有上面的内容。)然后,如果您可以从服务器填充 amp-form 中的字段 -直接使用辅助代码(不知道,我不使用它们),这样做 - 否则,您可能不得不通过 JavaScript “绕道”;使确定的 IP 地址可用于您的脚本(使用 PHP 创建 JS 变量),并将其放入客户端的目标字段中。
-
使用服务器端代码,这是不可能的,因为变量的值将在发送电子邮件时计算,因此我可以在那时获得我的服务器的 IP,并且包括在内不会受益。我无法添加 JS 添加代码,因为 AMP 不允许外部脚本。根据文档:AMP 电子邮件中只能包含受支持组件的 AMP 脚本
-
但是用户首先从你的服务器请求了amp页面,不是吗?届时将是确定他们的 IP 地址的时候了。
标签: php apache ip amp-html amp-email