htaccess перезаписывает разрывы относительных путей - PullRequest
12 голосов
/ 10 октября 2010

У меня есть файл 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]

Ответы [ 2 ]

16 голосов
/ 10 октября 2010

Проблема в том, что вы не учли, что относительные 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/ для отражения глубины пути.
8 голосов
/ 22 апреля 2013

Добавьте эту строку <BASE href="http://www.yoursitename.com/"> на свою страницу внутри тега <head> следующим образом:

<head>
        <title>Your site title</title>
        <BASE href="http://www.yoursitename.com/">
....
</head>
...