Javascript Regex для преобразования всех ссылок на сайте с http на https

Я хочу изменить все ссылки на веб-сайте на https, чтобы избежать смешанного контента, потому что мои разработчики всегда забывают изменить ссылки.

Я предполагаю, что есть способ, используя Javascript Regex, я могу найти HTTP и заменить его на https

Я пробовал такой код, но это был большой провал.

Я верю, что что-то в этом духе сработает

Я хотел бы использовать код в нижнем колонтитуле веб-сайта, чтобы он работал на всех страницах.

О каких ссылках вы говорите? Хранится внутри массива, свойство .src изображений, href?

obscure 27.06.2019 17:49

Хороший вопрос. Все ссылки в href и изображения так же src

Justin 27.06.2019 17:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
137
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я предполагаю, что это выражение или, может быть, его модифицированная версия,

(http)(:[^\s]+)

с заменой,

$1s$2

может быть то, что вы могли бы быть в поисках.

В этом демо выражение объясняется, если вам может быть интересно.

Тестовое задание

const regex = /(http)(:[^\s]+)/gm;
const str = `http://some_domain.com/some_link/`;
const subst = `$1s$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.info(result);

Этот код не находит мои существующие ссылки для изменения.

Justin 27.06.2019 18:12
Ответ принят как подходящий

На самом деле вы не показали никакого кода, который вы пробовали, но это довольно просто, и его можно сделать еще лучше с помощью умного использования селекторов запросов и некоторых методов массива:

[...document.querySelectorAll('*[src], *[href]')].forEach(element => {
  ['src', 'href'].forEach(attribute => {
    if (element[attribute]) {
      element[attribute] = element[attribute].replace(/^http:///ig, 'https://');
    }
  });
});

Мне нравится, как вы написали код, но он заставляет мои ссылки переходить на HTTP и не меняется на https.

Justin 27.06.2019 18:11

Вы уверены? Вы запускаете его после завершения загрузки DOM? Я только что проверил это, и, похоже, это сработало для меня.

IceMetalPunk 27.06.2019 18:34

Да, это не работает, я понятия не имею, почему. Я позволил DOM полностью загрузиться перед тестированием. Я думаю, что на этом веб-сайте есть странный код WP, который каким-то образом конфликтует, хотя в консоли нет ошибок.

Justin 27.06.2019 19:22

Если вы поместите console.info(attribute, element[attribute]) в самый внутренний блок if, сразу после того, где он устанавливает element[attribute] = ..., что покажет консоль?

IceMetalPunk 27.06.2019 19:23

ОМГ, это РАБОТАЕТ!! Он не работал с фоновыми изображениями, и это меня сбило с толку. Есть ли способ настроить атрибут URL? Я попытался добавить его в код, но это не сработало, добавив URL-адрес в код.

Justin 27.06.2019 19:31

Мой код. [...document.querySelectorAll('*[src], *[href], *[url]')].forEach(element => { ['src', 'href', 'url'].forEach(attribute => { if (element[attribute]) { element[attribute] = element[attribute].replace(/^http:///ig, 'https://'); } }); });

Justin 27.06.2019 19:32

Не существует такой вещи, как атрибут URL. Я предполагаю, что ваше фоновое изображение задается свойством CSS background-image? Поскольку это в CSS и заключено в url(), это сложнее. Вам нужно будет выбрать каждый элемент, который может иметь фоновое изображение (так что, вероятно, все с селектором *), запустить window.getComputedStyle() на нем, затем использовать регулярное выражение для свойства background-image, чтобы проанализировать URL-адрес, затем установить новый background-image в прямом стиле элемента на основе этого. Это не легко.

IceMetalPunk 27.06.2019 19:36

Да, фоновое изображение CSS. Звучит сложно. Я лучше задам другой вопрос для этого. Спасибо за вашу помощь, я многому научился.

Justin 27.06.2019 19:39

Вы можете получить HTML-коллекцию всех элементов определенного типа, используя document.getElementsByTagName()

Допустим, вы хотите изменить свойство .src всех <img>элементов.

var elements=document.getElementsByTagName("img");

Теперь, если вы перебираете элементы, вы можете изменить их свойство .src, используя метод заменять() объектов String.

elements[0].src=elements[0].src.replace("http","https");

Вот пример использования img и a для иллюстрации процесса:

function replace(htmlElements) {
  for (var a = 0; a < htmlElements.length; a++) {
    var localElement = htmlElements[a];
    var property;
    switch (localElement.localName) {
      case "img":
        property = "src";
        break;
      case "a":
        property = "href";
        break;
    }
    if (localElement[property].indexOf("https") == -1) {
      localElement[property] = localElement[property].replace("http", "https");
    }
  }
}
var elements = document.getElementsByTagName("img");
replace(elements);
elements = document.getElementsByTagName("a");
replace(elements);
<a href = "http://www.example.com/linkA">LinkA</a>
<a href = "https://www.example.com/linkB">LinkB</a>
<a href = "http://www.example.com/linkC">LinkC</a>
<img src = "http://picsum.photos/id/469/200/300">
<img src = "http://picsum.photos/id/269/200/300">

Этот код заставил некоторые из моих ссылок по какой-то причине превратиться в httpss.

Justin 27.06.2019 18:08

@Justin - да, это происходит, если это уже был https. Я исправил свой код выше, чтобы позаботиться об этом!

obscure 27.06.2019 20:57

Если вы используете jQuery, вы можете сделать что-то вроде этого:

$(function() {
 $("a").each(function() {
      if ($(this).attr("href").includes("http:"))
           $(this).attr("href",$(this).attr("href").replace("http:","https:"));
 });
 $("img").each(function() {
      if ($(this).attr("src").includes("http:"))
           $(this).attr("src",$(this).attr("src").replace("http:","https:"));
 });
});

НО, я не думаю, что это хорошая идея. Если вы поместите этот скрипт в нижний колонтитул, процессор HTML загрузит все активы по любому протоколу, который у вас есть, HTTP и т. д. Затем ваш скрипт запустится и, возможно, изменит URL-адреса. Затем процессор HTML загрузит эти активы во второй раз, чтобы обработать их. Если некоторые из этих ресурсов, скриптов или CSS, то страницу придется повторно отображать, возможно, несколько раз по мере ее сохранения. Это может привести к снижению производительности, дублированию загрузки ресурсов и, возможно, мерцанию страницы.

Если это локальные активы на вашем сервере или в CDN, лучшим решением будет по возможности использовать URL-адреса, не зависящие от протокола. Например:

<a href = "//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">

or <img src = "//myserver.com/image1.jpg">

Браузер заполнит http или https в зависимости от того, какой протокол использовался для получения веб-страницы. Если вы можете заставить своих разработчиков постоянно использовать этот метод, им не нужно менять протокол.

Код не удался, но мне нравится ваша идея с агностическим URL :)

Justin 27.06.2019 18:16

Для кода требуется библиотека jQuery; Я попробовал это в Code Pen. Он работал над моим HTML. codepen.io/anon/pen/eweKJQ

HBlackorby 27.06.2019 19:46

Другие вопросы по теме