Intereting Posts

Относительные URL-адреса с .htaccess

У меня есть настраиваемая инфраструктура 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 еще, чтобы сделать это с моей головы. Спасибо за любые ответы заранее.

Изменить: Кроме того, файл .htaccess содержит:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 

Редактировать # 2: Да, я знаю об использовании ведущего /.

Однако я не могу этого сделать с этим конкретным веб-сайтом, потому что это подпапка на сервере, поэтому ссылка на / будет идти в корень сервера, а не на сайт.

Если я поставлю /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, файлов изображений и ссылок, и вы должны быть в порядке с правилами перезаписи.