Смена корневого веб-каталога - проблема с ссылками - PullRequest
0 голосов
/ 26 октября 2018

Я пытался редактировать корневой веб-каталог через .htaccess файл:

RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f

и index.html изменение кода CSS, JS ссылки через базовый тег

<base href="http://example.com/newweb/">

но ссылки привязки не перенаправляют на example.com/#tag, а на example.com/newweb#tag

Мне нужен первый вариант для работы.

1 Ответ

0 голосов
/ 26 октября 2018

... но ссылки привязки не перенаправляются на 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 (постоянный), только когда вы подтвердите, что он работает нормально.

...