Правило перезаписи включает пути с косыми чертами, которые не работают

#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, нет.