【问题标题】:How can I use PHP to set my navbar hrefs to absolute paths?如何使用 PHP 将导航栏 href 设置为绝对路径?
【发布时间】:2017-05-23 13:29:18
【问题描述】:

我需要将这些锚点 href 标记设置为绝对路径,因为当我在文件夹中有 html 文档时,包含很多内容的标题不起作用(在某些情况下需要 ../)。

我看过一些建议使用的帖子:

$root = realpath($_SERVER['DOCUMENT_ROOT']);

$root = "http://" . $_SERVER['SERVER_NAME'];

第一个选项导致错误:

localhost/:1 不允许加载本地资源:file:///C:/xampp/htdocs/trips/index.php%7D

第二个选项导致了这个错误:

警告:include(): http:// wrapper 在服务器配置中被第 17 行 C:\xampp\htdocs\MountainPlanner\includes\header.php 中的 allow_url_include=0 禁用

警告:include(http://localhost/MountainPlanner/includes/db.php):未能打开流:在第 17 行的 C:\xampp\htdocs\MountainPlanner\includes\header.php 中找不到合适的包装器

警告:include():在第 17 行的 C:\xampp\htdocs\MountainPlanner\includes\header.php 中打开 'http://localhost/MountainPlanner/includes/db.php' 以包含 (include_path='C:\xampp\php\PEAR') 失败

如果有什么不同,我正在使用 XAMPP。

谢谢!

【问题讨论】:

  • 不要依赖 $_SERVER 进行包含。使用__DIR__ 常量并从当前文件所在的目录追加正确的相对路径。
  • 您的问题令人困惑,因为您询问hrefs 但您的错误涉及PHP 包括。看来您手头的问题不止一个。

标签: php apache xampp href


【解决方案1】:

HREF 导航栏路径 != 系统路径

网址路径

这是您在浏览器地址中看到的,它被 HTML(CSS、JavaScript 等)使用。 PHP 不需要担心它(除了一些流函数)。

为了动态创建基本路径,我使用了这个脚本

httpProtocol = !isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on' ? 'http' : 'https';

$base = $httpProtocol.'://'.$_SERVER['HTTP_HOST'].'/';

并且,当放入 href a 标签时:

<a href="<?php echo $base; ?>link" title="Link">Link</a>

系统路径

这是服务器用来在服务器上查找任何文件的工具。 PHP 使用它来include/require 位于服务器上的任何文件或共享文件。 Streams 函数也可以使用系统路径和 URL。

如我所见,您是在询问系统路径。我已经使用此代码来规范化应用程序路径:

ini_set('include_path',
    implode(
        PATH_SEPARATOR, 
        array_merge(
            array(dirname(__FILE__)),
            explode(PATH_SEPARATOR , ini_get('include_path'))
        ) 
    )
);

然后,我的应用程序根目录只能用作我的应用程序的绝对路径:

/Application/Require.php
/Application/Script.php
index.php

它也适用于任何文件:

require('Application/Require.php');
require('Application/Script.php');

【讨论】:

  • 这就是解决我的问题的方法,非常感谢!我还决定更改 PHP 中的包含路径,这为我简化了整个问题。
【解决方案2】:

在配置或常量文件中的某处设置第一行,甚至在文件中设置第一行。

<?php $base_url = "http://localhost/mysite/"; ?>

然后你可以像这样创建href链接:

<a href="<?=base_url?>my-link">clickie</a>

【讨论】:

  • 从错误判断,OP使用的是PHP包含。
【解决方案3】:

$_SERVER 包含由 Web 服务器填充的标头。它不可靠,它会禁止您的代码在本地或测试环境中运行。来自 php.net:

$_SERVER 是一个包含诸如标题、路径和脚本位置等信息的数组。此数组中的条目由 Web 服务器创建。无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。也就是说,在 » CGI/1.1 规范中包含了大量这些变量,因此您应该能够预料到这些变量。

总之,不要依赖它来提供有关您的服务器的信息。

PHP 提供了魔术常量 __FILE____DIR__,它们为您提供了当前文件的文件或目录的完整路径。

对于 PHP 包含,您应该将这些常量与您希望访问的文件的相对路径一起使用。

例如:

include __DIR__ . '/../file_in_previous_directory.php';
include __DIR__ . '/file_in_same_directory.php';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2013-02-05
    • 2011-06-06
    • 2010-09-25
    • 2018-07-21
    相关资源
    最近更新 更多