如何使用 PHP 制作 Canonicals
How to make Canonicals with PHP
我在 SO 上四处搜索,但找不到满足我需求的确切答案。
生成 URL 非常简单...
像这样:
<link rel="canonical" href="https://example.com<?php echo ($_SERVER['REQUEST_URI']); ?>" />
但是,问题在于,$_SERVER['REQUEST_URI'])
将始终获取正在使用的当前文件,因此规范 URL 可能会发生变化。
因此它可以在 www.example.com/hello.php 和 www.example.com/hello/ 之间切换,以及许多其他变化,具体取决于用户的使用方式访问您的网站。
如何使它始终相同 url? (最好没有。php)
我自己解决了,很基础:
<?php
$fullurl = ($_SERVER['REQUEST_URI']);
$trimmed = trim($fullurl, ".php");
$canonical = rtrim($trimmed, '/') . '/';
?>
那么……
<link rel="canonical" href="https://example.com<?php echo $canonical ?>" />
我敢肯定有不同的方法,但它对我有用。
我就是这么做的
<?php
// get the rigth protocol
$protocol = !empty($_SERVER['HTTPS']) ? 'https' : 'http';
// simply render canonical base on the current http host ( multiple host ) + requests
echo $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
?>
我认为您的脚本需要进行一些清理,对吗?
我的意思是,如果您的页面是
https://example.com/test.php
但一个恶意但无害的人会
https://example.com/test.php/anotherThing.php
您的规范将成为
https://example.com/anotherThing.php
不过,您不希望发生这种情况,对吗?特别是如果恶意的人不是无害的并且用你的 url 做最坏的事情......
这将删除查询参数,例如 ?search=abc&page=32
选项 1:
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . strtok($_SERVER['REQUEST_URI'], '?');
选项 2(作用相同):
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
然后回显
echo '<link rel="canonical" href="' . $url . '" />';
我在 SO 上四处搜索,但找不到满足我需求的确切答案。
生成 URL 非常简单...
像这样:
<link rel="canonical" href="https://example.com<?php echo ($_SERVER['REQUEST_URI']); ?>" />
但是,问题在于,$_SERVER['REQUEST_URI'])
将始终获取正在使用的当前文件,因此规范 URL 可能会发生变化。
因此它可以在 www.example.com/hello.php 和 www.example.com/hello/ 之间切换,以及许多其他变化,具体取决于用户的使用方式访问您的网站。
如何使它始终相同 url? (最好没有。php)
我自己解决了,很基础:
<?php
$fullurl = ($_SERVER['REQUEST_URI']);
$trimmed = trim($fullurl, ".php");
$canonical = rtrim($trimmed, '/') . '/';
?>
那么……
<link rel="canonical" href="https://example.com<?php echo $canonical ?>" />
我敢肯定有不同的方法,但它对我有用。
我就是这么做的
<?php
// get the rigth protocol
$protocol = !empty($_SERVER['HTTPS']) ? 'https' : 'http';
// simply render canonical base on the current http host ( multiple host ) + requests
echo $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
?>
我认为您的脚本需要进行一些清理,对吗? 我的意思是,如果您的页面是
https://example.com/test.php
但一个恶意但无害的人会
https://example.com/test.php/anotherThing.php
您的规范将成为
https://example.com/anotherThing.php
不过,您不希望发生这种情况,对吗?特别是如果恶意的人不是无害的并且用你的 url 做最坏的事情......
这将删除查询参数,例如 ?search=abc&page=32
选项 1:
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . strtok($_SERVER['REQUEST_URI'], '?');
选项 2(作用相同):
$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
然后回显
echo '<link rel="canonical" href="' . $url . '" />';