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>