#html #.htaccess #mod-rewrite
#HTML #.htaccess #мод-перезапись
Вопрос:
У меня есть старый веб-сайт, и я хочу его обновить и позволить ему использовать .htaccess Правила перезаписи для поисковых систем, например, предположим, что у меня есть это правило в моем файле .htaccess
RewriteRule ^category/electric category.php?type=8
это будет работать без каких-либо проблем, но при загрузке страницы изображения не будут отображаться, и css не применяется, после того, как я провел некоторый поиск в Интернете, я обнаружил, что эта проблема связана с тем, что URL-адрес выглядит следующим образом:
http://www.mywebsite.com/category/electric
и я нашел решение, но для его применения потребуется много времени, я обнаружил, что если я помещу полный URL-адрес в каждый элемент, для которого требуются такие пути, как JS, CSS, изображения, …… файлы, все будет в порядке, как это
<img src="images/image.png" width="100" height="100" alt="" />
Для
<img src="http://www.mywebsite.com/images/image.png" width="100" height="100" alt="" />
но это займет время, как я уже сказал, есть ли какой-нибудь способ решить эту проблему каким-либо решением.
и извините за плохой английский
Ответ №1:
Вы можете просто использовать полный URL-адрес изображения, например:
<img src="/images/image.png" width="100" height="100" alt="" />
Обратите /
внимание на перед images
: это делает путь относительно корня документа, а не текущего каталога.
Другой вариант — добавить <base>
тег на <head>
ваши страницы, например:
<base href="http://www.mywebsite.com/" />
Это заставит все относительные URL-адреса на странице действовать так, как если бы они были расположены по адресу http://www.mywebsite.com/
.
К сожалению, оба этих решения требуют редактирования HTML. HTTP / 1.1 определяет Content-Location
заголовок, который должен действовать как <base>
тег в HTML, но поддержка браузера для него, похоже, ограничена. (Например, Mozilla, похоже, решила не поддерживать его, потому что это нарушило бы работу слишком многих существующих сайтов.) По-видимому, некоторые версии спецификации HTTP также имели Content-Base
заголовок, но он также плохо поддерживался и позже был удален из стандарта.
Еще один вариант, конечно, заключается в том, чтобы заставить images/image.png
работать, даже если с префиксом category/
. Следующее правило перезаписи должно это сделать:
RewriteRule ^category/images/(.*) images/$1 [L,R=permanent]
(Внутреннее перенаправление также должно работать, но может привести к тому, что браузеры будут запрашивать изображения дважды, потому что они не понимают, что они одинаковые. Если изображения очень маленькие, это все равно может быть более эффективным.)
Комментарии:
1. Это обе хорошие идеи, но они также требуют, чтобы OP редактировал все свои HTML-файлы; Я считаю, что все, что они искали, было решением, которое не требовало всего этого (и просто включало изменение .htaccess).
2. Единственное решение, которое я могу придумать, которое не требует редактирования HTML, — это переписать URL-адреса изображений обратно, когда они запрашиваются. Я добавил это к своему ответу, а также упомянул одно не решение (плохо поддерживаемый
Content-Location
HTTP-заголовок).3. Используйте base только в крайнем случае. Поскольку все относительные ссылки могут разорваться.
4. @Gerben: В этом случае OP уже разорвал все свои относительные ссылки. Использование
<base>
может их исправить.
Ответ №2:
Вы можете попробовать правило перезаписи, например:
RewriteRule ^.*category/electric category.php?type=8
Обратите внимание на лишний «. *» в начале; это совпадение с шаблоном, что означает, что он должен разрешать любой URL-адрес, если он заканчивается на category / electric …
Комментарии:
1. Как это поможет OP?
2. Их проблема заключается (или, по крайней мере, кажется) в том, что их регулярное выражение правила перезаписи не соответствует URL-адресам, которые входят с материалом спереди. Итак, моя теория заключается в том, что, изменяя регулярное выражение, чтобы сопоставлять пути с чем-либо перед ними, это все исправит.
Ответ №3:
RewriteRule ^. (/images/.*)$ $1 [R=301]
Перенаправления example.com/category/images/example.jpg чтобы example.com/images/example.jpg
Не идеально, поскольку для каждого изображения требуется дополнительный http-запрос, но другого способа, кроме изменения html, нет.