#php #.htaccess
#php #.htaccess
Вопрос:
У меня есть .htaccess
файл, который перенаправляет все URL-запросы на мой index.php
AcceptPathInfo On
RewriteEngine on
RewriteBase /Projects/tester/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]
Внутри моего index.php У меня есть код, который включает URL-файл:
<?php
if(isset($_GET['request'])){
include('pages/'.$_GET['request'].'.php');
}else{
echo 'index';
}
?>
Если мой URL-адрес — это localhost/Projects/tester/green
мой индекс, он будет содержать файл с именем green.php
, который существует внутри папки pages
.
внутри pages/green.php У меня есть этот код:
<link rel="stylesheet" type="text/css" href="style.css">
<div id="greenBox">
This box is green!
</div>
Когда я запускаю этот URL, я вижу большой зеленый div с текстом внутри.
Отлично, теперь давайте создадим папку с именем subs
внутри папки pages
и создадим файл с именем yellow.php
<link rel="stylesheet" type="text/css" href="style.css">
<div id="yellowBox">
This box is yellow!
</div>
Когда я запускаю этот URL localhost/Projects/tester/sub/yellow
, я вижу текст, но style.css
не загружается (я не вижу желтый div).
Если все содержимое включено в index.php
и style.css
файл находится в той же папке, index.php
что и, почему green.php
можно загрузить style.css
, но yellow.php
нет?
Я вижу желтый div, только если добавляю ../style.css
внутри yellow.php , но если это будет работать таким образом, я считаю, что мы должны использовать ../style.css
на green.php в то время как в yellow.php использовать ../../style.css
, нет?
Есть ли способ решить эту проблему? проблема в .htaccess?
Ответ №1:
Конечно, внешний браузер не понимает, где находятся ваши файлы на сервере, поэтому, если вы находитесь в следующей ситуации (с точки зрения браузера):
http://localhost/Projects/tester/green
-> hey browser, load "style.css"
-> browser loads http://localhost/Projects/tester/style.css
Но если вы измените «виртуальный» путь:
http://localhost/Projects/tester/sub/yellow
-> hey browser, load "style.css"
-> browser loads http://localhost/Projects/tester/sub/style.css
Итак, у вас есть три решения здесь, в порядке моих личных предпочтений:
1) Используйте абсолютные URL-адреса для загрузки данных css, необязательно используя PHP var:
<link rel="stylesheet" type="text/css" href="/Projects/tester/style.css">
<link rel="stylesheet" type="text/css" href="<?php echo $base_path; ?>/style.css">
2) Используйте HTML-элемент <base> в head: (предупреждение: он применяется ко ВСЕМ относительным URL-адресам на странице: ссылкам, изображениям и т. Д.)
<head>
<base href="http://localhost/Projects/tester/" />
</head>
3) Если использование абсолютных URL-адресов не является вариантом, вы можете подсчитать, сколько «виртуальных подкаталогов» у вас отключено, и сгенерировать префикс, подобный этому:
<?php
// first calculate $virtal_subdirs_number
$relative_urls = str_repeat("../", $virtual_subdirs_number);
?>
<link rel="stylesheet" type="text/css" href="<?php echo $relative_urls; ?>/style.css">
Ответ №2:
Это потому, что style.css находится в родительском каталоге yellow.php , Поэтому для доступа к файлу в родительском каталоге вы должны указать путь, например ../style.css, что означает поиск его в одном каталоге назад, а /style.css означает в текущем каталоге, который содержит yellow.php