Htaccess переписывает относительные пути
У меня есть файл htaccess, который отображает
http://www.myserver.com/home/
в
http://www.myserver.com/index.php?section=home
Эта часть работает нормально. Проблема, с которой я столкнулся сейчас, - все мои изображения и css находятся в подпапке с именем assets, т.е.
http://www.myserver.com/assets/images/
http://www.myserver.com/assets/css/
и т.д.
После перенаправления браузер будет искать файлы под
http://www.myserver.com/home/assets/images/
что заставляет вещи сломаться, поскольку это не допустимый путь.
Мне удалось добавить еще один переписывающий файл, который отображает приведенное выше в правильную подпапку, однако Firebug показывает, что изображения находятся в:
http://www.myserver.com/home/assets/images/
Я знаю, что это не проблема, в конце концов, мои изображения и CSS очень просто загружаются с этим правилом.
Мне просто любопытно, как я могу сделать путь, показанный как фактический путь, который:
http://www.myserver.com/assets/images/
Вставка файла htaccess ниже. Большое вам спасибо.
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^([^/]+)/assets/(css|images|js)/(.*)$ /assets/$2/$3 [NC,L]
RewriteRule ^([^/]+)/$ /index.php?section=$1 [NC,L]
Ответы
Ответ 1
Проблема заключается в том, что вы не считали, что относительные URL-адреса разрешены в базовом URI, который является URI документа HTML, в котором используется ссылка. Таким образом, относительный путь URI, например assets/images/
, в документе HTML с использованием пути URI /home/
разрешено /home/assets/images/
вместо /assets/images/
.
Вы не можете изменить это с помощью mod_rewrite, поскольку разрешение URI выполняется клиентом, а не сервером. Единственными решениями являются:
- измените базовый URI, используя элемент
BASE
(обратите внимание, что это влияет на все относительные URI);
- с использованием абсолютных путей URI, например.
/assets/images/
вместо относительного assets/images/
;
- настройка относительного пути URI, поэтому ссылки в
/home/
настраиваются на ../assets/images/
, чтобы отразить глубину пути.
Ответ 2
Добавьте эту строку <BASE href="#" onclick="location.href='http://www.yoursitename.com/'; return false;">
на свою страницу внутри тега <head>
следующим образом:
<head>
<title>Your site title</title>
<BASE href="#" onclick="location.href='http://www.yoursitename.com/'; return false;">
....
</head>