5

对于具有绝对 URL 路径的相对 URL,我通常使用以下链接做法:

<a href="/relative/path/to/document.html">

但我将实现绝对 URL

<a href="http://example.com/relative/path/to/document.html">

更改它们对我来说不是问题(在 HTML 文档中自动查找和替换)。

但是,确保它可以在我的本地主机(支持 PHP)以及网络上运行的最佳实践是什么?为什么?


例如,这里是我如何做 PHP 包括:

<?php include($_SERVER['DOCUMENT_ROOT']."/relative/path/to/document.html"); ?>

href对URL采用相同的方法?不同的 PHP 技术更好吗?很想知道为什么。

4

5 回答 5

6

在本地和 Web 主机上保持相同的目录结构,并尽可能使用相对 URI 和路径。如果必须使用绝对 URI,请在某处定义一次,并在需要输出 URI 时使用常量,以避免使用查找和替换进行更改。

<?php
    define('ROOT_URI', 'http://example.com/subdirectory');
?>

<a href='<?php echo ROOT_URI; ?>/relative/path/to/document.html'> document </a>

如果您有一个配置文件或其他一些只定义一次的包含文件,那就更容易了。

于 2013-01-17T03:10:55.500 回答
6

您可以只在 HTML href 中包含一个预定义的常量或变量。

例如

<?php
define("LOCAL", "http://localhost");
define("WEB", "http://foo.bar");
$environment = LOCAL; //change to WEB if you're live
?>
<a href="<?php echo $environment; ?>/relative/path/to/document.html">
于 2013-01-17T03:18:17.757 回答
3

这一切都取决于您计划如何托管内容。PHP 不是一个糟糕的选择,因为有大量的托管公司支持 PHP。如果没有像 PHP 这样的脚本语言,您最好的选择是 javascript,但取决于您尝试使 URL 成为绝对的原因,这可能会破坏您的目的。

我建议的一件事是制作一个配置文件,因为您可能依赖也可能不依赖 $_SERVER['DOCUMENT_ROOT']。

说:config.php

<?php
define("HOST", "http://example.com");
// Whatever else you might need on all files.

然后每个需要它的文件,把它放在顶部

<?php
include_once(dirname(__FILE__)."/config.php");

// Keep in mind this path is relative to current file, so if you are 3 sub-folder keep
// include_once(dirname(__FILE__)."/../../../config.php")
?>

...

<a href=<?php echo HOST;?>/relative/path/to/document.html">...
于 2013-01-17T03:25:12.127 回答
0

您可以在 head 标签中添加以下行,而不是这样做。现在您可以提供与您的根目录相关的所有网址。现在,当您上传到服务器或在 localhost 上工作时。只需在此处更改网址。

<base href="http://mydomin.com/" />
于 2014-04-12T20:57:01.703 回答
0

这是一个适用于远程和本地服务器的解决方案,不需要更改域名:

$protocol = isset($_SERVER["HTTPS"]) ? 'https://' : 'http://';
$url_base = $protocol . $_SERVER['HTTP_HOST'];

使用这两行代码,如果您更改域名,则无需更改代码,如果您在 HTTP 和 HTTPS 之间切换,也无需更改代码。随意更改您喜欢的变量名称。

因此,您的链接代码将如下所示:

<a href="<?php echo $url_base; ?>/relative/path/to/document.html">link</a>

关于安全的重要更新:

但是,此解决方案存在安全风险。这是一篇关于它的文章。

$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']变量可以通过在访问站点时发送不同的 Host 标头来更改:

curl -H "Host: notyourdomain.com" http://yoursite.com/

这样做,任何使用$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']将使用 notyourdomain.com 的 URL。

更进一步,假设攻击者使用您的电子邮件填写密码重置表单并更改主机标头。然后,密码重置电子邮件会将您定向到他们的网站。如果您关注域,那很好,但普通用户不会,这就是网络钓鱼攻击起作用的原因。

所以谨慎使用或最好避免使用它。

以下是链接文章中处理多种环境的方法:

在处理多个环境时,您可以使用 $_SERVER['HTTP_HOST']and $_SERVER['SERVER_NAME'],但只能检查您所在的域,然后手动设置正确的 URL。您可以使用一组有效域保持简单:

$domains = array('domain.com', 'dev.domain.com', 'staging.domain.com', 'localhost');
if (in_array($_SERVER['HTTP_HOST'], $domains)) {
    $domain = $_SERVER['HTTP_HOST'];
}else {
    $domain = 'localhost';
}

你也可以让它更短一点:

$domains = array('domain.com', 'dev.domain.com', 'staging.domain.com', 'localhost');
$domain = in_array($_SERVER['HTTP_HOST'], $domains) ? $_SERVER['HTTP_HOST'] : 'localhost';
于 2016-12-01T10:10:00.383 回答