проблема нуба с переписыванием модов и относительными URL - PullRequest
6 голосов
/ 25 февраля 2010

Я, должно быть, делаю что-то ужасно неправильно, потому что, как бы я ни пытался или гуглял, я не могу найти ответ: (

Итак, я хочу, чтобы URL был похож на http://localhost/BLUEPRINT/list/857 на самом деле загрузить идеально работающий URL, как это: http://localhost/BLUEPRINT/list.php?lid=857

Я могу написать правило перезаписи в файле .htaccess и прочитать переменную lid. Проблема в том, что все пути в list.php являются относительными. Css, изображения, JavaScript и т. Д. Поэтому, когда SEO-дружественный URL загружается, все эти элементы просматриваются внутри BLUEPRINT / list / 857 /...

Так, например, это: <img src="images/logo.png" /> на самом деле примерно так, когда запрашивает дружественный к SEO URL: <img src="list/857/images/logo.png" />

Так что я могу сделать?

Возможно, я мог бы попытаться преобразовать все пути на страницах в корневой каталог (например, "/BLUEPRINT/images/logo.png") вместо относительного. Но на странице есть десятки, и даже если я это сделаю, они не будут работать на реальном сервере, потому что там может быть "/ images" вместо "/ BLUEPRINT / images". Поэтому я не мог просто загрузить свои файлы на реальный сервер.

Какие у меня варианты? Как все эти замечательные сценарии, такие как WordPress, Joomla, e.t.c. справиться с этой проблемой? Что, черт возьми, я делаю не так? Это сводит меня с ума!

Ответы [ 3 ]

3 голосов
/ 26 февраля 2010

Ваши новые URL не имеют такой же префикс базового пути. Это означает, что относительные пути URL разрешаются по-разному. Ссылка images/logo.png теперь разрешена в /BLUEPRINT/list/images/logo.png вместо /BLUEPRINT/images/logo.png.

Чтобы исправить это, используйте абсолютные URL-пути в ваших ссылках, например:

<img src="/BLUEPRINT/images/logo.png" />

Или, если вы не хотите добавлять путь базового URL /BLUEPRINT/ ко всем ссылочным элементам, установите базовый URL с помощью base:

<base href="/BLUEPRINT/" />

Теперь относительные пути URL разрешаются из этого базового URL вместо текущего URL. Но учтите, что изменение базового URL влияет на все относительные URL.

1 голос
/ 25 февраля 2010

Вы можете написать условие, которое позволяет проходить запросы к CSS, JS и другим путям и игнорировать ваши правила перезаписи для list.php. Вот пример.

# Turn on URL rewriting
RewriteEngine On

# If your URL is www.example.com/, use /
RewriteBase /

# Find CSS and JS paths
RewriteCond $1 ^(BLUEPRINT/css|BLUEPRINT/js)

# No rewriting
RewriteRule ^(.*)$ - [PT,L]

Вот отличный учебник от Apache с множеством примеров: http://httpd.apache.org/docs/2.2/misc/rewriteguide.html

Удачи!

РЕДАКТИРОВАТЬ: Другая хорошая ссылка от Apache - это документы mod_rewrite. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html Выполните текстовый поиск для «сквозной передачи».

Другая часть RewriteRule, на которую следует обратить внимание, это тире '-'. Это означает, что «замена не должна выполняться».

Наконец, я добавил в пример правила RewriteEngine и RewriteBase. Это должно сделать его более полным.

0 голосов
/ 25 февраля 2010

Вы пытались применить правило "RewriteBase"?

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritebase

...