PHP относительные пути и каталоги - PullRequest
2 голосов
/ 20 октября 2011

Мне интересно кое-что, но я не могу найти хороший, четкий ответ или даже решение этой проблемы:

Мой сайт PHP имеет следующую структуру:

root
   functions
   generators
   helpers
   scripts
   style
   index.php

Это все папки и один файл php.Функции содержат множество файлов php op, связанных с подключением к базе данных и различными другими операциями с базами данных, такими как вставка, удаление, обновление, ... Генераторы содержат классы для автоматического создания веб-страниц, чтобы они выглядели одинаково.Помощники - это классы, которые обрабатывают вход в систему, выход из системы, регистрацию и т. Д. Сценарии - это JavaScript, а стиль - это CSS.

В папке моих генераторов есть файл mainGenerator.php, который генерирует различные части веб-сайта:

 private function generateLogin()
    {
        if (!isLoggedIn()) {
            echo "
                <h2>Login</h2>
                <form method='post' action='../helpers/login.php' id='loginForm'>
                <p>
                Username:<br/>
                <input class='search' type='text' name='username'/>
                Password:<br/>
                <input class='search' type='password' name='password'/>
                <input name='login' type='image' style='border: 0; margin: 0 0 -9px 5px;' src='style/login.png' alt='Login' title='Login'/><br/>
                No account yet? <a href='../register.php'>Register</a>
                </p></form>";
        } else {
            echo "
                <h2>Welome, <a href='user.php' style='color: #1293EE;'>" .
                 $_SESSION['user_name'] .
                 "</a></h2>
                <a href='logout.php'>Log off</a>";
        }
    }

Этот фрагмент кода генерирует поле для входа на каждой странице или отображает приветственное сообщение, если пользователь уже вошел в систему. Как видите, действие ссылается на "../helpers/login.php"потому что это относительное местоположение логинхелпера с точки зрения этого генератора.

Теперь вот проблема: если я нажимаю кнопку входа в систему на index.php (http://example.com/ProjectName/index.php), он перенаправляет меня наhttp://example.com/helpers/login.php и говорит, что файл не найден.

Я вижу, в чем проблема, действие post видит запрос, поступающий из index.php, поднимается на один каталог и затем ищет / helpers/login.php, который, конечно, не существует.

Исправление может состоять в том, чтобы изменить действие на

action='/helpers/login.php'

, но это дает мне ту же проблему, если мне нужен доступ к generateLogin () из определенного подкаталога ... Как можно решить эту конкретную проблему, а именно: чтобы ссылка на /helpers/login.php оставалась верной, независимо от того, откуда я пытаюсь получить к ней доступ.

Ответы [ 2 ]

10 голосов
/ 20 октября 2011
action='/ProjectName/helpers/login.php'

Если ваш корень равен http://localhost, то приведенная выше ссылка всегда должна указывать на http://localhost/ProjectName/helpers/login.php независимо от того, вызывается ли она из http://localhost/ProjectName/index.php или http://localhost/ProjectName/subdir/index.php

Если вы не хотите жестко кодировать «ProjectName» во многих различных сценариях, вы можете использовать глобальную переменную и определить ее в файле конфигурации:

helpers / ConfigOptions.php:

<?php
$ProjectName = "ProjectName";
?>

Затем включите в свои сценарии файл конфигурации и используйте определенную вами переменную:

index.php:

include $_SERVER['DOCUMENT_ROOT'] . '/helpers/ConfigOptions.php';

...

echo "
  <form action='/$ProjectName/helpers/login.php'>
  ....
";

Подробнее о DOCUMENT_ROOT:

DOCUMENT_ROOT определяется в файле конфигурации сервера и является корневым каталогом файловой системы, в которой выполняются сценарии, не веб-адрес, который вы вводите в браузере.В приведенном выше примере я предполагаю, что корень документа выглядит примерно так: / home / user / www / ProjectName.Если DOCUMENT_ROOT - только / home / user / www, вы можете изменить свой включаемый путь на:

include $_SERVER['DOCUMENT_ROOT'] . '/ProjectName/helpers/ConfigOptions.php';

или использовать относительный путь.Мой голос был бы за последнее, так как вам не нужно было бы жестко кодировать «ProjectName».

Так что include () и require () будут принимать либо:

  1. Абсолютный путь кфайл
  2. Путь относительно текущего исполняемого скрипта.Если A включает в себя B, а B включает в себя C, то когда B включает в себя C, ему необходимо указать путь относительно A .

Итак, когда вам нужно использовать DOCUMENT_ROOT?Обычно с шаблонами, где относительный путь, такой как ../helpers/file.php, может разрешать различные абсолютные пути в зависимости от того, что включает файл.В приведенном выше примере, где index.php включает в себя ConfigOptions.php, вам, вероятно, не нужно использовать DOCUMENT_ROOT, поскольку index.php не является шаблоном.Я все равно использовал его, чтобы быть в безопасности, но, возможно, я открыл здесь целую банку с червями.Надеюсь, я вас больше не смутил.

2 голосов
/ 20 октября 2011

Если у вас есть ссылка, начинающаяся с косой черты, то всегда добавляется в корневой каталог, а не в текущий каталог ...

Так что, если ваша страница www.example.com/mySite/foo.html и у вас есть такая ссылка: <a href="/bar.html">Bar/<a>, пользователь будет перенаправлен на www.example.com/bar.html ...

Вы должны просто указать точку действия формы на helpers/login.php

...