header("Location: url") 不重定向

Posted

技术标签:

【中文标题】header("Location: url") 不重定向【英文标题】:header("Location: url") does not redirect 【发布时间】:2017-08-13 03:27:01 【问题描述】:

我在尝试从我的 AMP 页面重定向到其他页面时浪费了很多时间。提交表单时,xhr-action 会调用一个 php 文件,并使用 POST 发送数据。 此 php 文件设置了一个新位置以将页面重定向到另一个位置。我在 php 文件中要重定向的代码是下一个:

<?php 
header("Content-type: application/json");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: https://www.dominio.com/amp/*");
header("AMP-Access-Control-Allow-Source-Origin: https://www.dominio.com");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");
$especi=$_POST["especialidad"];
$paises=$_POST["ES"];
$paismx=$_POST["MX"];
$paispr=$_POST["PR"];
$paiscl=$_POST["CL"];
$paisco=$_POST["CO"];
$paisar=$_POST["AR"];
if(isset($paises))
    $urlbase="https://www.dominio.es/p/";
    $pais="ES";
    $provin=$paises;
    $pobla=0; //$_POST["zn2"];

/*
else if(isset($paismx))
    $urlbase="https://www.dominio.mx/p/";
    $pais="MX";
    $provin=$paismx;
    $pobla=$_POST["zn2"];

else if(isset($paispr))
    $urlbase="https://www.dominio.com/p/";
    $pais="PR";
    $provin=$paispr;
    $pobla=$_POST["zn2"];

else if(isset($paiscl))
    $urlbase="https://www.dominio.cl/p/";
    $pais="CL";
    $provin=$paiscl;
    $pobla=$_POST["zn2"];

else if(isset($paisco))
    $urlbase="https://www.dominio.co/p/";
    $pais="CO";
    $provin=$paisco;
    $pobla=$_POST["zn2"];

else if(isset($paisar))
    $urlbase="https://www.dominio.com.ar/p/";
    $pais="AR";
    $provin=$paisar;
    $pobla=$_POST["zn2"];
*/


$queryespe="SELECT * FROM tx WHERE Id='$especi'";
$resultespe = mysqli_query($link,$queryespe);
$fila = mysqli_fetch_array($resultespe);
$especialidad=$fila['Keyword'];
$especialidad=reemplazargui($especialidad);
$especialidad=reemplazarac($especialidad);
if($pobla!=0)
    $querypo="SELECT * FROM ts WHERE Id='$pobla'";
    $resultpo = mysqli_query($link,$querypo);
    $filapo = mysqli_fetch_array($resultpo);
    $poblacion=reemplazargui($filapo['Keyword']);
    $ulr=$urlbase.$especialidad."/".reemplazarac($poblacion)."/";
    mysqli_close($link);
    header ("Location: $ulr");
    die();
else
    $querypo="SELECT * FROM tx_2 WHERE Id='$provin'";
    $resultpo = mysqli_query($link,$querypo);
    $filapo = mysqli_fetch_array($resultpo);
    $poblacion=reemplazargui($filapo['Keyword']);
    $ulr=$urlbase.$especialidad."/".reemplazarac($poblacion)."/";
    mysqli_close($link);
    $ulr = html_entity_decode($ulr);
    header ("Location: $ulr");
    die();
    

?>

该过程正确到达 entity_decode 并且我放入标头中的 url (ulr) 是正确的。 我从 chrome 网络分析中得到的响应是下一个(我不明白为什么存在两个相同 url 的启动器,此外,它不起作用)。 错误日志:

Fetch API 无法加载 https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com。 重定向自 'https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com' 到 'https://www.dominio.es/m/Alergologo/Albacete-Provincia/' 有 被 CORS 策略阻止:“Access-Control-Allow-Origin”标头 具有不等于的值“https://www.dominio.com/amp/*” 提供的原产地。因此,原点 'http://www.dominio.com' 是 不允许访问。让服务器发送带有有效的标头 值,或者,如果不透明的响应满足您的需求,则设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。

获取失败 https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com : 获取失败

未捕获的错误:表单提交失败::获取失败 https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com: 获取失败​​​​报告 在 na.f.assert (log.js:295) 在 xhr-impl.js:164

所以,我需要重定向到另一个页面,从 AMP 页面调用到我正在显示的 php 文件,该文件必须重定向到最终页面。重定向不适用于此代码

编辑:问题可能出在 CORS 策略上,但我已将此行添加到 htaccess 文件中,并且无法正常工作。

<IfModule mod_headers.c>
    <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>

编辑 2: 修改标题:

ob_start();
header("Content-type: application/json");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: https://www.dominio.com/amp/*");
header("AMP-Access-Control-Allow-Source-Origin: https://www.dominio.com/amp/*");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");

错误:

Fetch API 无法加载 https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com。 重定向自 'https://www.dominio.com/amp/include/listado.php?__amp_source_origin=http%3A%2F%2Fwww.dominio.com' 到 'https://www.dominio2.es/m/Alergologo/Alicante-Provincia/' 已经 被 CORS 策略阻止:“Access-Control-Allow-Origin”标头具有 值 'https://www.dominio.com/amp/*' 不等于 提供的原产地。原点 'http://www.dominio.com' 因此不是 允许访问。让服务器发送带有有效值的标头, 或者,如果不透明的响应满足您的需求,请将请求的模式设置为 'no-cors' 来获取禁用 CORS 的资源。

编辑 3:已解决

添加标题以允许 CORS 已解决问题。必须将它们添加到所有受影响的域中。

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: https://www.dominio.com/amp/*");
header("AMP-Access-Control-Allow-Source-Origin: https://www.dominio.com/amp/*");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");

【问题讨论】:

请比“它不起作用”更具体。您期待什么,实际发生了什么,您是否收到任何警告或错误出现在输出/日志等中?您是否打开了 error_reporting/logging?另外,如果您可以对输出进行文字描述而不是粘贴屏幕截图,那将非常有帮助 好的,谢谢。我会编辑。 请检查我的答案。谢谢。 好的,我可以看到问题所在。其中一个 URL 是 HTTPS,但另一个不是。我认为从 HTTP 重定向到 HTTPS 是可以的,但根据 CORS 的规则,反之则不行。 en.wikipedia.org/wiki/Cross-origin_resource_sharing 但是我认为所有的重定向都来自HTTPS,HTTP重定向在哪里? 【参考方案1】:

解决方案已添加到帖子中,编辑 3。

添加标题以允许 CORS 已解决问题。必须将它们添加到所有受影响的域中。

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: https://www.dominio.com/amp/*");
header("AMP-Access-Control-Allow-Source-Origin: https://www.dominio.com/amp/*");
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");

【讨论】:

应该已经添加了代码,而不是对问题的引用 你不懂;您在“答案”区域中写的内容是“评论”,而不是答案。请编辑此内容以包含解决方案;这就是这个区域的用途。 Uncaught ReferenceError: header is not defined 我得到了这种错误【参考方案2】:
    REPLACE,
    header ("Location: $ulr");
    die();
    WITH,
    header ("Location: $ulr");
    ?>
    <script type="text/javascript">
    location.href = '<?php echo $ulr ?>';
    </script>
    <?php
    die();

【讨论】:

我想我不能使用脚本,因为这个文件是由 AMP 页面调用的。 AMP 页面是什么意思? AMP 是一种“新”的 html 格式,可被 google 缓存并更快地提供服务。该技术不允许执行脚本。 put ob_start();在 PHP 引用文件的开头。谢谢。 如果可以的话,你能分享一下文件吗?可能存在导致问题的空格。谢谢。

以上是关于header("Location: url") 不重定向的主要内容,如果未能解决你的问题,请参考以下文章

php执行了header("Location: index.php");后面程序会继续执行吗?

尝试使用 PHP Header("Location: ") 函数重定向

php 用header("Location:")如何跳转到前一个页面,就是历史页面。

php刷新当前页面?

如何使用JavaScript实现 按钮跳转页面功能?

js如何获取response header信息