как писать гиперссылки во включаемых файлах - PullRequest
1 голос
/ 25 мая 2011

У меня есть веб-сайт на моей локальной машине (Windows 7, XAMPP). Мой сайт использует некоторые PHP. Включения появятся на многих страницах сайта, возможно, вложенных во многие уровни каталогов. Это делает невозможным использование относительных ссылок. Проблема решается с помощью абсолютных ссылок, но абсолютные ссылки на моем локальном компьютере будут отличаться от удаленного сервера. Например, я бы написал файл включения для веб-сервера, например:

<nav id="main">
  <ul>
    <li><a href="http://domainname.com/topic1/">Topic1</a></li>
    <li><a href="http://domainname.com/topic2/">Topic2</a></li>
  </ul>
</nav>

Но на моей локальной машине я должен написать:

<nav id="main">
  <ul>
    <li><a href="C:\xampp\htdocs\website\topic1\index.php">Topic1</a></li>
    <li><a href="C:\xampp\htdocs\website\topic2\index.php">Topic2</a></li>
  </ul>
</nav>

Кто-нибудь знает, как обычно решается эта проблема?

Ответы [ 6 ]

2 голосов
/ 25 мая 2011

Нет необходимости хранить корень документа в конфигурации и изменять его каждый раз, когда вы перемещаете приложение.

Используйте переменную сервера DOCUMENT_ROOT:

<a href="<?php echo $_SERVER['DOCUMENT_ROOT']; ?>/path/to/file.php">Link</a>
2 голосов
/ 25 мая 2011

Большинство фреймворков обрабатывают это, используя значение конфигурации ($base_url = 'http://www.domain.com';) и затем вызывая его при создании ссылок.

<nav id="main">
  <ul>
    <li><a href="<?php echo $base_url;?>/topic1/">Topic1</a></li>
    <li><a href="<?php echo $base_url;?>/topic2/">Topic2</a></li>
  </ul>
</nav>

Это должно решить проблему до тех пор, пока вы не забудете изменить базовый URL при перемещении между серверами.

Однако вы все равно не должны ссылаться на что-то вроде C:\xampp\htdocs\website\topic1\index.php, это должно быть http://localhost/website/topic1/index.php.

1 голос
/ 25 мая 2011

"/" эквивалентно 'http://www.mydomain.com' или' http://localhost' (корень вашего сайта) и сохраняет ваш протокол http или https, почему правильно, что уже есть? Если вы вкладываете свой сайт в папки, это не очень хорошая идея для тестирования. Я опускаю приложение, которое хочу протестировать, в корневую папку локального сервера для тестирования (как настоящий веб-сервер) и удаляю его, когда я не тестирую, это очень простое решение.

<nav id="main">
  <ul>
    <li><a href="/topic1/index.php">Topic1</a></li>
    <li><a href="/topic2/index.php">Topic2</a></li>
  </ul>
</nav>
1 голос
/ 25 мая 2011

Вы можете использовать относительные ссылки, например (прямая косая черта - хороший вариант):

<a href="../topic2/index.php">Link to Topic 2</a>

или используйте абсолютные ссылки с переменной PHP:

<?php
    $topUrl = 'c:/xampp/htdocs/website';
?>
<a href="<?=$topUrl?>/topic2/index.php">Link to Topic2</a>

Но мое предпочтительное решение использует какой-то шаблонизатор - я предпочитаю Smarty .

1 голос
/ 25 мая 2011

Вы можете определить константу в файле конфигурации .php, который вы включаете везде:

define('ROOT_URL', '/');

Если вы используете Windows Matchin (где вы, скорее всего, будете запускать веб-приложение на http://localhost/..., не запрашивая PHP-файлы у C:\), измените его на:

define('ROOT_URL', '/website');

Затем используйте эту константу при генерации ссылок:

<li><a href="<?php echo ROOT_URL ?>/topic1/index.php">Topic1</a></li>
0 голосов
/ 26 мая 2011

Лично я бы сделал это следующим образом

config.php

if ($_SERVER['REMOTE_ADDR'] == 'your pc ip here') {
   // Its for the local site
   $rootUrl = 'http://localhost/'; // The url needed for the local website
} else {
   // The url for the online version
   $rootUrl = 'http://mydomain.com/';
 }
 // Set the url ready
define('ROOT_URL', $rootUrl);

Файлы, где нужен URL-адрес

<?php include('config.php'); // Path to the config file ?>

<nav id="main">
  <ul>
    <li><a href="<?php echo ROOT_URLl;?>topic1/">Topic1</a></li>
    <li><a href="<?php echo ROOT_URLl;?>topic2/">Topic2</a></li>
  </ul>
</nav>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...