PHP включает в себя, относительные атрибуты src и страницы ошибок Apache - PullRequest
0 голосов
/ 04 августа 2011

Я использую страницу ошибки 404, найденную по адресу:

/error_pages/404.php

У меня есть шаблон обычной страницы, используемый для отображения всех видов сообщений пользователю по адресу:

/message.php

МойСтраница ошибки выглядит следующим образом:

require_once("../includes/core.php");

$message = "Sorry but we could no longer find the item that you were looking for";
$messageStart = "Not Found";

require_once("../message.php");

У меня найдена страница администратора по адресу:

/admin

Теперь моя проблема - файлы CSS и JS в message.php.Если 404 произошел в корне документа, все ссылки разрешаются в их правильные местоположения, и все файлы включаются в HTML.Если 404 произошло в /admin, все ссылки разрешаются, как если бы message.php было найдено в /admin/message.php!

Я уже пытался использовать константу наподобие PATH_TO_ROOT, которая определяется для каждой страницы или определяется core.php в зависимости от значения $ _SERVER ["PHP_SELF"].

Сейчаспроблема в вышеприведенном подходе состоит в том, что $ _SERVER ["PHP_SELF"] всегда содержит /error_pages/404.php, поэтому PATH_TO_ROOT всегда будет содержать '../' и испортит все 404, происходящие в корне документа.определить PATH_TO_ROOT внутри message.php, тогда все 404 в /admin будут испорчены.

Как мне решить эту проблему?

РЕДАКТИРОВАТЬ:

Я пытался использовать $ _SERVER ["REQUEST_URI"].Файлы CSS и JS теперь правильно включены.Проблема в том, что PHP включает.Все включения разрешаются с /error_pages, где находится 404.php.Эти PHP включают в себя PATH_TO_ROOT, так что PATH_TO_ROOT на основе REQUEST_URI действительно не так хорош.

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Использовать ссылки, относящиеся к сайту root:

<link rel="stylesheet" href="/css/default.css" />

Используйте косую черту в начале пути к «start» в корневой папке сайта.Таким образом, путь всегда один и тот же.

0 голосов
/ 04 августа 2011

Сделав это в моем собственном фреймворке, решение может быть немного усложняющим для доступа и не очень хорошо задокументированным многими другими в сети. На самом деле вам нужно учесть 3 проблемы:

  • Где находится корень WEB и где расположен код вашего движка / фреймворка соответственно
  • Где находится корень файлов PHP для вашего движка / фреймворка и включает / требует соответственно
  • Расчет правильного пути для CSS / JS / Images / etc ...

Если предположить несколько мелких деталей, то все это можно легко обойти. Сначала сделаем предположение, что ваш фреймворк будет находиться в известной папке (назовите его framework) и у него будет известное имя файла (опять же, framework.php). Затем, чтобы найти путь к структуре в вашем обработчике index.php, вы можете использовать:

// in index.php
$frameworkPath = './';
while((is_dir($frameworkPath))&&(!file_exists($frameworkPath.'framework/framework.php'))){
  $frameworkPath = ($frameworkPath!='./')?'../'.$frameworkPath:'../';
}
if(!file_exists($frameworkPath.'framework/framework.php')){
// some type of error handler here
}else require_once($frameworkPath.'framework/framework.php');

// in framework.php
if(!defined('FRAMEWORK_PATH')){
  $frameworkpath = str_replace("\\", '/', dirname(__file__));
  if(substr($frameworkpath, -1)!='/') $frameworkpath .= '/';
  define('FRAMEWORK_PATH', $frameworkpath);
}
// now your requires become require_once(FRAMEWORK_PATH.'filename/relative/framework.php');

Затем нам нужно вычислить установленный путь к сайту. Мы можем сделать это, используя DOCUMENT_ROOT и путь к «текущему доступному файлу». Нечто похожее на следующее:

$serverPath = $_SERVER['DOCUMENT_ROOT'];
$thisPath = @realpath(dirname('./'));
$thisPathLength = strlen($thisPath);
$SitePath = '/'.str_replace('\\','/', substr($thisPath, strlen($serverPath), $thisPathLength)).'/';

Это также дает нам абсолютный путь к файлам сайтов PHP, и мы можем воспользоваться тем, что система включения PHP позволяет нам указывать абсолютные пути к файлам, а не только относительные, для включения пользовательских скриптов. thisPath - это то, что используется для пользовательских скриптов, включает и требует. Например, если вы хотите включить файл в /path/to/site/user_script.php, вы можете сделать следующее:

require_once($thisPath.'user_script.php');

SitePath теперь можно использовать для настройки включений, связанных с файлами CSS / JS / etc. Таким образом, вместо того, чтобы заявить

<img src="img.jpg" />

вы говорите

<img src="<?php echo $SitePath;?>img.jpg" />.

Если вас заинтересовало, я довел мою текущую платформу до такой степени, что она стала общедоступной, в конце концов я собираюсь выпустить ее с открытым исходным кодом, но я не выполнил документацию, поэтому ее можно прочитать на свой страх и риск: ). Я расширил это, чтобы использовать SIMPLE_HTML_DOM_PARSER, чтобы он обновлял теги в исходном HTML для дизайнера, и им не нужно было беспокоиться об атрибутах src, action, href и т. Д. Для тегов. Конечно, это немного замедляет рендеринг, но делает жизнь дизайнеров намного проще:)

0 голосов
/ 04 августа 2011

Ну, если я хорошо понимаю ваш вопрос, и вы действительно хотите использовать относительные, а не абсолютные пути (например, /css/style.css), я бы попытался вычислить глубину текущего документа с помощью чего-то вроде:

$depth = substr_count($_SERVER["DOCUMENT_URI"], "/") - 1;

А затем для пути используйте:

<link rel="stylesheet" type="text/css" href="<?=str_repeat("../", $depth)?>css/style.css" />

Я не тестировал код, но он должен работать. Попробуйте это. Надеюсь, это помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...