... но ссылки привязки не перенаправляются на example.com/#tag
, а на example.com/newweb#tag
Да, использование элемента base
(для исправления относительных URL) не обходится без предостережений. Якорь на странице, такой как #tag
, является «относительным URL», поэтому теперь он относится к base
URL.
Единственный способ решить эту проблему - полностью квалифицировать ваши внутристраничные ссылки с помощью корневого (или абсолютного) URL-адреса текущей страницы / URL-адреса. (Который может в первую очередь лишить смысла использование тега base
в качестве обходного пути для ваших других относительных URL-адресов.) Или не используйте относительные URL-адреса для ваших ресурсов / других страниц в первую очередь .
См. Мой ответ на аналогичный вопрос о стеке Pro Webmasters для более подробной информации:
ОБНОВЛЕНИЕ: Посмотрев на ваш сайт, который, по сути, является одностраничным сайтом, который использует идентификаторы фрагментов (т. Е. #tag
) для всех внутристраничных ссылок, вам следует изменить все относительный URL-адреса ваших ресурсов (CSS, JS и изображения) должны быть корневыми (начиная с косой черты) и удалить элемент base
.
Относительно «root-относительного», оно должно быть корневым относительно вашего ожидаемого корня на стороне клиента, а не фактического корня файловой системы.
Например, следующий относительный URL в вашем источнике HTML:
vendor/bootstrap/css/bootstrap.min.css
Должен быть изменен на относительный корень URL (не путь к файловой системе):
/vendor/bootstrap/css/bootstrap.min.css
Обратите внимание, что сюда не входит подкаталог файловой системы /newweb
.
Директивы в .htaccess
, а затем внутренне переписывают URL-адрес на /newweb/vendor/bootstrap/css/bootstrap.min.css
(путь к базовой файловой системе). Подкаталог /newweb
тогда полностью скрыт от клиента.
Используя тег base
в своем HTML, вы также открываете подкаталог /newweb
для клиента (и поисковых систем) и потенциально создаете дублирующийся контент, поскольку ваш сайт доступен как в example.com/
, так и в example.com/newweb/
. .
RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
Однако эти директивы не верны. У вас есть другие директивы в вашем файле .htaccess
? Последняя директива RewriteCond
сама по себе недействительна в конце. И предыдущий RewriteRule
переписывает Everyithing в корень каталога (что может объяснить, почему вы прибегли к использованию относительных URL-адресов в своем источнике HTML?)
Чтобы переписать все по соответствующему URL в подкаталоге /newweb
, вам понадобится что-то вроде:
RewriteEngine On
# Rewrite enverything to the /newweb subdirectory
RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L]
Это предполагает, что ваша страница ссылается только на ресурсы, которые содержатся в подкаталоге /newweb
, а не где-либо еще в файловой системе. Если да, то вам также понадобится проверка файловой системы.
Однако само по себе это не решает проблему доступности example.com/newweb/
(хотя это менее важно сейчас, когда URL-путь не отображается). Это может быть решено с помощью внешнего перенаправления из /newweb
обратно в корень документа (но мы должны быть осторожны с циклом перенаправления, учитывая переписывание в противоположном направлении).
Итак, попробуйте следующее:
RewriteEngine On
# If /newweb is requested directly then redirect to remove it
RewriteCond %{REDIRECT_STATUS} ^$
RewriteRule ^newweb/?(.*) /$1 [R=302,L]
# Rewrite enverything to the /newweb subdirectory
RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L]
Измените 302 (временный) rediredct на 301 (постоянный), только когда вы подтвердите, что он работает нормально.