относительные пути и каталоги php

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

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

root functions generators helpers scripts style index.php 

Это все папки и один файл php. Функции содержат связные операционные файлы php, связанные с подключением к базе данных, и различные другие операции с базой данных, такие как вставка, удаление, обновление, … Генераторы содержат классы для автоматического создания веб-страниц, чтобы они выглядели одинаково. Помощники – это классы, которые обрабатывают логин, выход из системы, регистрацию и т. Д. Скрипты – это 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 post видит запрос, поступающий из index.php, и поднимается на один каталог, а затем ищет /helpers/login.php, которого, конечно, не существует.

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

 action='/helpers/login.php' 

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

 action='/ProjectName/helpers/login.php' 

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

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

хелперы / 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 к этому:

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

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

Поэтому include () и require () будут принимать либо:

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

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

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

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

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