如何在 localhost 和 Web 服务器上实现绝对 URL?

Posted

技术标签:

【中文标题】如何在 localhost 和 Web 服务器上实现绝对 URL?【英文标题】:How to implement absolute URLs on localhost and web server? 【发布时间】:2012-12-31 13:12:43 【问题描述】:

我通常使用relative URLs with an absolute URL path 的以下链接实践:

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

但我会实现绝对网址

<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 技术更好吗?很想知道为什么。

【问题讨论】:

我的建议是在本地机器上创建几个虚拟主机,例如local.example.org 并编辑您的主机文件以使其解析为本地主机。 你试过$_SERVER['SERVER_NAME']$_SERVER['HTTP_HOST']吗? 据我所知,HTTP_HOST 并不是真的为此而生? 【参考方案1】:

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

$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>

关于安全的重要更新:

但是,此解决方案存在安全风险。这是article on it。

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

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

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

更进一步,假设攻击者填写了密码重置 使用您的电子邮件表单并更改主机标题。密码重置 然后电子邮件会将您定向到他们的网站。如果你关注 到域,你很好,但普通用户没有,这就是为什么 网络钓鱼攻击有效。

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

从链接的文章中,这是一种处理多种环境的方法:

在处理多个环境时,可以使用 $_SERVER['HTTP_HOST']$_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';

【讨论】:

【参考方案2】:

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

<base href="http://mydomin.com/" />

【讨论】:

谢谢,但这不在问题的范围内,因为 URL 不是绝对的。还有a number of complications with the base element,但是在IE8中也不行【参考方案3】:

在本地和 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>

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

【讨论】:

这个定义的好地方是在配置文件中。每个部署都可以自定义环境。 ROOT_URI 和 echo 优先于 include 和 DOCUMENT_ROOT 吗?为什么?谢谢 DOCUMENT_ROOT 是一个物理文件路径,它适用于您的 include 语句,但不适用于生成实际的 URI。见***.com/questions/7868652/serverdocument-root。另外,在我的示例中,我只是将常量命名为 ROOT_URI,您可以随意命名(例如,在另一个答案中,常量命名为 HOST)。【参考方案4】:

这完全取决于您计划如何托管内容。 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">...

【讨论】:

但我不是在这里寻找相对链接——就像你为配置文件的 3 路径深度链接所做的那样 为什么我不能依赖 DOCUMENT_ROOT? 如果webserver不是apache,环境变量可能不一样。也许 PHP 可以解释这一点,但我认为以前没有。 啊,这里是Apache【参考方案5】:

您可以只在 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">

【讨论】:

你必须在这个小镇上快点! 谢谢。 defineecho 是否优于 includeDOCUMENT_ROOT?为什么? @Baumr include 将文件加载到 PHP 文件中。它与您网站的 URI 无关。 @rink.attendant.6 抱歉,忽略那部分——并不是要包含它。前两者是否比使用$_SERVER['DOCUMENT_ROOT']. 更受欢迎,为什么?

以上是关于如何在 localhost 和 Web 服务器上实现绝对 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在esp8266上实现web server

如何同时在 localhost 和 web 上运行 Ruby 项目?

在本地主机上的 glassfish 4.0 上实现 ssl

如何在 asp.net Web 窗体上实现 Ninject 或 DI?

如何通过Holer实现HTTP和HTTPS访问本机localhost WEB服务器

如何测试 robots.txt 是不是在 localhost 的本地 Web 服务器中工作?