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: ") 函数重定向