Мне интересно что-то, но я не могу найти хороший, ясный ответ или даже решение этой проблемы:
Мой сайт 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 () будут принимать либо:
Итак, когда вам нужно использовать 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