У меня есть настраиваемая инфраструктура PHP, в которой все после того, как домен отправлен на PHP как переменная $ _GET, вот так:
RewriteRule ^(.*)$ index.php?page_request=$1 [QSA,L]
Вся маршрутизация выполняется с помощью файла маршрутизатора. Например, http://domain.tld/page
отправляется на http://domain.tld?page_request=home
.
Однако, если у меня есть структура, подобная каталогу (например, http://domain.tld/page/
), запрос отправляется, но любые относительные URL-адреса в HTML теперь относятся к /page
, хотя мы все еще находимся в уровень корня в домене.
Чтобы уточнить:
Переход на http://domain.tld/page
и запрос res/css/style.css
в HTML возвращает таблицу стилей.
Переход на http://domain.tld/page/
и запрос res/css/style.css
возвращает ошибку 404, потому что каталог page/
каталог фактически не существует.
Каков наилучший способ обойти это? Это кажется очень простым, но я недостаточно хорош с .htaccess еще, чтобы сделать это с моей головы. Спасибо за любые ответы заранее.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
Однако я не могу этого сделать с этим конкретным веб-сайтом, потому что это подпапка на сервере, поэтому ссылка на /
будет идти в корень сервера, а не на сайт.
Если я поставлю /subfolder/css
для каждой ссылки на сайте, это не только утомительно, но и проблематично, чтобы вложенная папка изменилась. Есть ли лучший способ обойти это?
Другие ответы, которые говорят, что вы должны абсолютизировать пути, верны. Если вы работаете в подпапке, есть две вещи, которые вы можете / должны сделать, чтобы помочь:
1) Используйте RewriteBase
в файле htaccess
RewriteEngine on RewriteBase /framework/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/?$ index.php?url=$1 [QSA,L]
2) Создайте константу в своей структуре, которая имеет тот же путь
define('FULL_PATH', '/framework');
Затем каждый раз, когда вы создаете URL-адрес в html, убедитесь, что вы делаете что-то вроде
<a href="<?= FULL_PATH ?>/your/remaining/path">
Немного дополнительной работы, чтобы думать об этом каждый раз, когда вы создаете URL-адрес на странице, но он будет хорошо служить вам в долгосрочной перспективе.
Относительные URL-адреса не зависят от правил перезаписи apache. Они подходят к браузеру. Если браузер отправляет запрос для /some/random/path/
, вы можете переписать его все, что хотите, на сервере, но браузер интерпретирует все относительные URL как внутренние /some/random/path/
Если вы хотите включить res/css/style.css
из корня, вы должны префикс его с помощью косой черты, чтобы сделать это ясно: /res/css/style.css
Если вы ищете динамическое решение (если вы переместите весь сайт в подпапку или другой домен), вы можете использовать PHP для получения абсолютного пути к файлу, который вы используете (например, ваш основной файл php), а затем сохраните его путь в константе или переменной, которую вы можете использовать для всех ваших ссылок.
if ( !isset($_SERVER['HTTPS']) ) { $domain = 'http://'.$_SERVER['HTTP_HOST']; } else { $domain = 'https://'.$_SERVER['HTTP_HOST']; }; $root = $domain.str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__) );
Первые две строки просто определяют, как будет запускаться путь, должен ли он быть http или https. Третья строка получает полный путь к файлу, в который находится этот код, удаляет ненужные части (user / public_html) и сохраняет его в переменной $ root.
Затем вы можете связать свои файлы таким образом:
<script src = "<? php echo $ root;?> / jquery.js"> </ script>
С помощью этого метода сайт можно перемещать в любой домен или подпапку, и вам не нужно беспокоиться о нарушении ссылок.
Edit: Я просто подумал о более легком способе использования этого метода. Вместо использования абсолютных ссылок вы могли бы использовать свои обычные относительные ссылки вместе с этим в заголовке документа:
<base href="<?php echo $root; ?>/">
Это переписывает базовый путь для ваших относительных ссылок на правильный каталог. Тогда это будет работать:
<script src="jquery.js"></script>
Вам нужно абсолютизировать все пути в вашем html-коде, чтобы вы ссылались на свой CSS, используя абсолютные пути вместо относительного.
Если вы столкнулись с этой проблемой, я подозреваю, что ваш CSS выглядит так:
<link href="res/css/style.css" rel="stylesheet" type="text/css" media="screen" />
Но это должно выглядеть так:
<link href="/res/css/style.css" rel="stylesheet" type="text/css" media="screen" />
Сделайте то же самое для javascript, css, файлов изображений и ссылок, и вы должны быть в порядке с правилами перезаписи.