【问题标题】:PHP - Get IP when page calling by htaccessPHP - 通过 htaccess 调用页面时获取 IP
【发布时间】:2016-01-12 20:31:55
【问题描述】:

我有一个 PHP 网站,需要知道访问客户端的 IP 是什么。为此,我使用以下功能:

function get_client_ip() {
    $ipaddress = '';
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    }

    return $ipaddress;
}

但是当通过 url omenorpreco.com/teste 访问站点时,页面返回服务器 IP。

访问页面url omenorpreco.com/teste.php时,页面返回客户端IP。

这个错误可能是因为当你访问没有扩展名“.php”的页面时,服务器通过.htaccess来解释页面?

如何调整我的应用程序以进行两种访问,返回客户端 IP,而不是服务器 IP?

在我的 htaccess 代码之上


php_value allow_url_fopen on php_value allow_url_include 1 重写引擎开启 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !.(js|ico|txt|gif|bmp|jpeg|jpg|png|css|log|rss|zip|xml|sql|pdf|doc|docx|xls)$ url_amigavel.php RewriteRule 站点地图-categoria.xml$ sitemap.php?number=categoria RewriteRule 站点地图-([0-9]+).xml$ sitemap.php?number=$1 RewriteRule sitemap_index.xml$ sitemap_index.php

和url_amigavel.php代码

<?php

$geturl = explode( "/", str_replace( strrchr( $_SERVER["REQUEST_URI"], "?" ), "", $_SERVER["REQUEST_URI"] ) );
array_shift( $geturl );

$tipo = $geturl[0];


if ( is_file( "$tipo.php" ) )
{
    include "$tipo.php";
}
else
{
    echo "page not found";

}

?>

编辑:我可以使用客户端 IP 在 HTACCESS 中设置 GLOBAL_VAR 吗?

【问题讨论】:

  • 您的应用程序如何处理 url 路由..
  • @rjdown OP 没有问怎么做?
  • 将.htaccess 文件内容添加到您的帖子中。似乎(通过一个 URL 上的 1 行和另一个 URL 上的 2 行的回显)路由到不同的脚本可能是罪魁祸首
  • 能把url_amigavel.php (url_friendly.php) 的内容发一下吗?

标签: php .htaccess get ip


【解决方案1】:

我想我刚刚看到它在您的服务器上运行! 将.htaccess改为;

php_value allow_url_fopen on
php_value allow_url_include 1

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !.(js|ico|txt|gif|bmp|jpeg|jpg|png|css|log|rss|zip|xml|sql|pdf|doc|docx|xls)$ url_amigavel.php
RewriteRule sitemap-categoria.xml$ sitemap.php?number=categoria
RewriteRule sitemap-([0-9]+).xml$ sitemap.php?number=$1
RewriteRule sitemap_index.xml$ sitemap_index.php

SetEnvIfNoCase Remote_Host "(.*)" HTTP_MY_REMOTE_HOST=$1
SetEnvIfNoCase Remote_Addr "(.*)" HTTP_MY_REMOTE_ADDR=$1

将test.php 更改为;

function get_client_ip() {
    if (isset($_SERVER[REDIRECT_HTTP_MY_REMOTE_ADDR])) {
        return $_SERVER[REDIRECT_HTTP_MY_REMOTE_ADDR];

    } else if (isset($_SERVER[REDIRECT_HTTP_MY_REMOTE_HOST])) {
        return $_SERVER[REDIRECT_HTTP_MY_REMOTE_HOST];

    } else if (isset($_SERVER[HTTP_MY_REMOTE_ADDR])) {
        return $_SERVER[HTTP_MY_REMOTE_ADDR];

    } else if (isset($_SERVER[HTTP_MY_REMOTE_HOST])) {
        return $_SERVER[HTTP_MY_REMOTE_HOST];

    }
}

echo get_client_ip();

在.htaccess 中设置变量的灵感来自:http://www.askapache.com/htaccess/setenvif.html

很高兴它终于成功了!

【讨论】:

  • 我认为剩余的斜杠可能是导致404 的原因,如果前一个不起作用,请尝试我的更新答案
  • 该死。尝试将echo $tipo; 放在if 语句之前,以查看从何处请求文件
  • $tipo.php 是你的 get_client_ip 函数所在的文件吗?
  • 嗯,似乎是对的,认为我的解决方案没有任何区别。
  • 终于!!!!!!太感谢了。当我在 htaccess 中设置变量时,我可以从客户端获取正确的 IP。谢谢!!
【解决方案2】:

把它放在一个文件中,并在有和没有扩展名的情况下运行:

<?php
function get_ip_address() {
    return $_SERVER['REMOTE_ADDR'];
}
    echo get_ip_address();

?>

如果你运行上面的,你会得到什么错误?

编辑: 你能像这样编辑你的.htaccess,看看错误是否仍然发生:

php_value allow_url_fopen on
php_value allow_url_include 1
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !.(js|ico|txt|gif|bmp|jpeg|jpg|png|css|log|rss|zip|xml|sql|pdf|doc|docx|xls)$ $1.php [L]
RewriteRule sitemap-categoria.xml$ sitemap.php?number=categoria
RewriteRule sitemap-([0-9]+).xml$ sitemap.php?number=$1
RewriteRule sitemap_index.xml$ sitemap_index.php

【讨论】:

  • 嗨,搅拌。您可以访问此页面吗? omenorpreco.com/test2.php omenorpreco.com/test2 我将您的代码放入此页面进行测试.. 访问并查看错误.. 第一个链接恢复正确的 ip 第二个链接返回服务器 ip 第二个链接通过 htaccess 访问页面 test2.php .
  • 网页无法为我加载。请您再检查一下服务器设置。
  • 我调整了我的文件test2.php,结果是一样的..你能访问吗?
  • 我无法访问该页面,它显示“此网页不可用”。
  • 我可以访问它,IP地址问题仍然存在。似乎服务器发出了新的请求,或者url_amigavel.php 做了一些重要的事情(要求发布)。
【解决方案3】:

您的 .htaccess 中的 allow_url_include 设置为 1。这会导致问题,因为当您告诉 PHP 包含一个文件时,预处理器认为它是一个 URL,其他人已经告诉过您,所以让我们直接开始吧。

我的猜测是,只需禁用 allow_url_include。这是一种不好的做法,存在安全风险,例如,仅使用 file_get_contents 没有什么是您不能做的。

如果您仍然相信包含远程文件是一个好主意,您应该尝试使用完整路径,将这个包含与 Benjy1996 给您的代码一起使用:

include(getcwd().$tipo.".php");

PD:您可能应该更改您的 ip 函数以仅返回 $_SERVER['REMOTE_ADDR'],因为它是您最信任的,因为它最难伪造。

【讨论】:

  • 您好 Benjy / David - 我尝试更改我的 htaccess,删除两行 php 值设置,并输入代码
    include (getcwd()."/".$tipo ."。 php");
    到 url_amigavel.php 中,两个都不起作用。 =(
  • 我刚刚在我的服务器上复制了您的原始.htaccess、test.php 和url_amigavel.php,并提供了预期的结果ets.16mb.com/test 和ets.16mb.com/test.php。似乎必须在某处进行不同的配置。
  • WOW.. =(你只是复制我的原始文件?我访问了你的服务器并且工作正常。也许它的服务器配置?
  • 是的,您的原始代码有效:)。它在某处的一些配置。你能想到什么可能导致这种情况吗?您正在使用的任何框架或已设置的其他配置?
  • 我想我可能找到了可能的原因,只检查$_SERVER['HTTP_X_FORWARDED_FOR']字段,忽略REMOTE_ADDR,有时.htaccess可以用RewriteRules改变这个字段
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 2012-11-01
  • 2020-04-07
  • 2014-01-31
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多