如何在 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 thebase
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">
【讨论】:
你必须在这个小镇上快点! 谢谢。define
和 echo
是否优于 include
和 DOCUMENT_ROOT
?为什么?
@Baumr include
将文件加载到 PHP 文件中。它与您网站的 URI 无关。
@rink.attendant.6 抱歉,忽略那部分——并不是要包含它。前两者是否比使用$_SERVER['DOCUMENT_ROOT'].
更受欢迎,为什么?以上是关于如何在 localhost 和 Web 服务器上实现绝对 URL?的主要内容,如果未能解决你的问题,请参考以下文章
如何同时在 localhost 和 web 上运行 Ruby 项目?
如何在 asp.net Web 窗体上实现 Ninject 或 DI?