Как было предложено, я пытаюсь оставить свои старые форумы «на месте», одновременно используя Discourse на том же домене. Мне удалось настроить nginx как прокси и обойти любые конфликты с URL-адресами Discourse, поэтому при первоначальной загрузке страницы всё работает отлично (а также с точки зрения SEO).
Моя проблема заключается в том, что при переходе по ссылкам на старые страницы внутри Discourse приложение перехватывает эти URL как внутренние ссылки, из-за чего возникает ошибка 404. Я перепробовал множество способов обойти это с помощью доступных инструментов, но ничего не работает ни с URL, ни с одним доменом. (Кроме того, я не хочу размещать Discourse в подпапке).
Если бы я мог добавить что-то в массив SERVER_SIDE_ONLY, чтобы имитировать то, что я делаю в nginx, это должно было бы сработать. Есть ли у кого-нибудь предложения, как это сделать, или какой-то другой вариант?
Это совсем не то, что рекомендовалось в той теме. Вам следует начать свой новый форум на новом поддомене и оставить старый позади.
Я думаю, что это верно. Если вы действительно хотите разместить старый и новый форум на одном домене (что, опять же, кажется ужасной идеей с учётом проблем, которые вы уже описали), теоретически можно настроить другой домен как CNAME для старого и заставить Discourse ссылаться на него. Тогда система будет считать, что это другой сервер, и не станет пытаться обрабатывать эти ссылки самостоятельно. Когда nginx получит ссылку, он либо просто отдаст данные с другого домена, либо перенаправит браузер на нужный адрес.
Я рассматривал возможность размещения старого контента на поддомене archive (рискуя повлиять на SEO), но даже в этом случае я не думаю, что существует способ заставить Discourse изменять ссылку, предоставленную пользователем, иначе как создав постоянную ссылку для каждой возможной страницы. Предполагаю, что использование поддомена archiveв конечном итоге станет преобладающим, когда люди узнают о нём и будут копировать/вставлять ссылки из адресной строки браузера.
Если бы вы только что выполнили импорт, то для всех этих ссылок существовали бы постоянные ссылки, но это не очень полезно. И это именно тот тип рассуждений, который мог бы прийти в голову человеку, для которого импорт является значительной частью заработка.
Самый простой вариант — перенести новый форум на новый URL (надеюсь, вы еще не нанесли серьезного ущерба SEO) или перенести старый форум на другой (при этом SEO для старого контента будет утеряно, хотя, возможно, удастся настроить нормализацию постоянных ссылок или использовать магию NGINX для перенаправлений). Новый сайт уже давно работает?
Возможно, вы сможете создать нормализацию постоянных ссылок… нет. Мне кажется, что permalink_normalizations работают только для постоянных ссылок, и они не могут быть внешними. Возможно, будет возможно использовать компонент темы для поиска соответствующих URL и их переписывания с использованием поддельного имени хоста CNAME, но я не уверен, что именно попадает в готовый пост (полный URL с именем хоста или процесс обработки удаляет имя хоста?).
! Я могу решить это на странице 404 с помощью скрипта в HTML темы…
Я настроил страницу 404 так, чтобы она перезагружала окно браузера по «отсутствующему» URL, что приводит к обращению к серверной части. Это работает! Единственный недостаток, который я вижу, — это заметное перенаправление, и вы покидаете приложение для любых настоящих 404 (теряя боковую панель/заголовок).
<script type="text/discourse-plugin" version="0.8">
api.onPageChange((url, title) => {
const router = api.container.lookup('service:router');
var is404 = document.getElementsByClassName("page-not-found");
if (is404.length) {
const params = new URLSearchParams(router.currentRoute.queryParams).toString();
let q = "";
if (params){ q = "?"+params; }
window.location.replace(window.location.origin + url + q);
}
});
</script>
Я думаю, что toy должен быть способен перехватывать их на стороне клиента, как я и предлагал ранее. Включают ли ссылки на старый сайт в HTML имя хоста?
Компонент темы создан! Он ищет все href, указывающие на hostname с путем, соответствующим предоставленным вами регулярным выражениям, а затем добавляет обработчик события click, который устанавливает window.location для пропуска внутреннего маршрутизатора.
URL-адреса в пределах одного домена действительно получают одну рамку и всё ещё имеют ту же проблему, что и обычная ссылка. Мой компонент темы будет применяться к любым ссылкам <a href в сообщении, поэтому он также работает для ссылок с одной рамкой.