Переписывание URL сломало ссылку на css - PullRequest
3 голосов
/ 28 марта 2011

Я использую следующие настройки для перезаписи URL:

RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

В index.php это синтаксический анализ $_GET['url'], поэтому в следующих примерах:

ROOT/user/id/1/name/bobby // user is the page, id = 1, name = bobby
ROOT/blog/post/123/title/welcome // blog is the page, post = 123, title = welcome

Так что первый параметр (я не знаю, как его вызвать) - это имя страницы, а следующие пара параметров похожи на «ключи / значение». Теперь, когда я просматриваю ROOT/, ссылка на таблицы стилей, вставленные в HTML-страницу и страницу, отображаются правильно. Я просматриваю ROOT/index (то же самое, что и ROOT/), он показывает страницу (с содержимым и другими вещами) правильно, но ссылки (даже если в html-структуре правильно написаны) на таблицы стилей не загружаются. И я вижу это из того факта, что моя страница вообще не имеет CSS, когда я ее загружаю.

Как я могу это исправить?

EDIT

Путь к css-файлу следующий:

project/view/css/common.css

Файл, в котором он находится, находится в

project/public/index.php // the one with .htaccess and rewrite rules

Это приводит меня к созданию ссылки (внутри index.php), такой как

../view/css/common.css

Но это работает по-разному в зависимости от того, как выглядит URL. Например:

# For URL = public/
project/view/css/common.css // good
# For URL = public/index/
project/public/view/css/common.css // broken
# For URL = public/index/key/value
project/public/index/key/view/css/common.css // broken

Ответы [ 3 ]

7 голосов
/ 29 марта 2011

Комментарий не позволяет мне отформатировать код, попробуйте пожалуйста:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^.*\.(css|jpe?g|gif|png|js|ico)$ [NC]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Обновление

Вы можете попробовать что-то подобное в разделе <head> своих страниц, чтобы поддержать относительный путь для ваших файлов изображений / css / js, на которые есть ссылки на этой странице:

<head>
<base href="http://www.example.com/static-files/" />
</head>
4 голосов
/ 29 марта 2011

Я думаю, что у вас есть две проблемы (поскольку данные ответы еще не решили вашу проблему ...):

  1. Вы переписываете все имена файлов, поэтому, когда браузер запрашивает css/index.css, ваша перезапись преобразует это в index.php?url=css/index.css. Ответ @ cOle2 должен решить это.

  2. Вы не используете абсолютные пути для ваших CSS-файлов. Сервер переводит запрошенную страницу как /user/id/1/name/bobby в /index.php?etc...., но когда браузер запрашивает, например, файл css, который похож на css/index.css в вашем коде, он фактически запрашивает /user/id/1/name/bobby/css/index.css, и этот файл не существует. Вы можете решить эту проблему, используя только абсолютные пути к вашим внешним файлам (css, js, images и т. Д.), Например /css/index.css.

Редактировать: Судя по вашим комментариям, оба пути являются относительными, и ваш CSS не доступен для браузера, поэтому вам необходимо:

  1. Переместить css в каталог project/public (например, project/public/css)
  2. Используйте абсолютные пути к вашему CSS, как /css/index.css.
  3. Убедитесь, что URL-адреса ваших внешних файлов не переписываются сервером.
2 голосов
/ 28 марта 2011

Вы можете попробовать удалить некоторые расширения файлов из правила перезаписи, например, следующее правило не учитывает файлы изображений, css и js.

# Do not process images or CSS files further
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]

Редактировать: Вот как я бы применил это:

RewriteEngine On
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...