问题描述
所以我确实有一个网站托管在我自己的服务器 (UpCloud) 上,使用 Plesk。我也在使用 Cloudflare。 基本上我确实为我的网站为世界不同地区创建了多个目录(en/fr/de/etc...) 我的 index.PHP 中有一个这样的脚本,可以根据他们的国家自动重定向人们。
<?PHP
require 'IP2Location.PHP';
$loc = new IP2Location('databases/IP-COUNTRY.BIN',IP2Location::FILE_IO);
$record = $loc->lookup($_SERVER['REMOTE_ADDR'],IP2Location::ALL);
if($record == 'US') {
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://mywebsite.com/en');
exit;
}
?>
问题是我收到了这个错误,即 500。无论我尝试过什么,它都不起作用。添加一些 .httaccess 代码,添加一些我在互联网上为 Apache 和 Nginx 设置等找到的代码...
你们中的一些人是否遇到了同样的问题并解决了它?
先谢谢你!
编辑:使用
找到了一个可行的解决方案$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
解决方法
HTTP 301 重定向应设置为 header()
函数的第三个参数
<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
require 'IP2Location.php';
$loc = new IP2Location('databases/IP-COUNTRY.BIN',IP2Location::FILE_IO);
$record = $loc->lookup($_SERVER['REMOTE_ADDR'],IP2Location::ALL);
if($record == 'US') {
header('Location: https://mywebsite.com/en',true,301);
exit;
}
,
终于找到了解决方案
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
,
确保在调用 header()
之前没有生成任何输出。
检查 <?php
之前是否有空格/不可见字符。在 IP2Location.php
中也检查一下。
不确定这是否相关,但您可以尝试仅使用“Location”标头,而不是 HTTP 响应的第一行:
if($record == 'US') {
header('Location: https://mywebsite.com/en');
exit;
}
见https://www.php.net/manual/en/function.header.php 它说它将使用 302 而不是您的 301:
第二个特殊情况是“Location:”标题。它不仅 将此标头发送回浏览器,但它也会返回一个 REDIRECT (302) 浏览器的状态码,除非 201 或 3xx 状态码 已经设置好了。
<?php
header("Location: http://www.example.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>