Удаление заголовка из URL ломает ссылки

All three of the following links are to the second post in this topic. However, only the first two work. The third one worked until very recently, and we use it pretty extensively in our community to avoid cluttering wiki posts that reference several posts within the topic. That third link now just loads endlessly and never actually shows the content.

[full title link](https://meta.discourse.org/t/link-to-post-within-same-topic-doesnt-work-if-there-is-no-title-in-the-url/121455/2)
full title link

[short title link](https://meta.discourse.org/t/short/121455/2)
short title link

[no title link](https://meta.discourse.org/t/121455/2)
no title link


P.S. Sorry about not using try.discourse.com earlier. I’ll create an account over there for next time.

Second post to demonstrate the bug.

What you’re actually using there is a hack, especially if it is a deep link to a specific post. This is the correct permalink URL form

https://meta.discourse.org/t/{title}/{topic-id}/{post-id}

This has been hacked up to work, when people accidentally omit the topic ID, we guess that if the “topic title” is all numeric, they meant the topic ID:

https://meta.discourse.org/t/{topic-id}

So this works

https://meta.discourse.org/t/121455

but this cannot, for what I hope are obvious reasons

https://meta.discourse.org/t/topic-title

But adding the post number to that is riskier.

I recommend not relying on sort of hacky undocumented behaviors, though, and switching to this formally supported form

https://meta.discourse.org/t/x/121455/2

The third link does work if you open it in a new tab. It’s only when you click within one tab that it breaks. And it breaks bad - you can’t even click the logo to go back to the front page of the forum.

TypeError: Cannot read property 'get' of undefined
    at n.setupController (application-779d3dc401b01d1322f0bf8b26cb0e5f4c83a62f26cbecbd52159a94370dffc3.br.js:68)
    at n.a.setup (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:8)
    at i (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.routeEnteredOrUpdated (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.setupContexts (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.finalizeTransition (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17
    at f (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at T (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at E (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)

Error while processing route: topic.fromParams Cannot read property 'get' of undefined TypeError: Cannot read property 'get' of undefined
    at n.setupController (https://d11a6trkgmumsb.cloudfront.net/assets/application-779d3dc401b01d1322f0bf8b26cb0e5f4c83a62f26cbecbd52159a94370dffc3.br.js:68:14673)
    at n.a.setup (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:8:6889)
    at i (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:23930)
    at u.n.routeEnteredOrUpdated (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:24069)
    at u.n.setupContexts (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:23260)
    at u.n.finalizeTransition (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:22253)
    at https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:21378
    at f (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:29538)
    at T (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:30915)
    at E (https://d11a6trkgmumsb.cloudfront.net/assets/ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17:30814)

Uncaught TypeError: Cannot read property 'cancelFilter' of undefined
    at n.deactivate (application-779d3dc401b01d1322f0bf8b26cb0e5f4c83a62f26cbecbd52159a94370dffc3.br.js:68)
    at n [as deactivate] (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:10)
    at n.a.exit (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:8)
    at u.n.setupContexts (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.getTransitionByIntent (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.transitionByIntent (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.doTransition (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at u.n.intermediateTransitionTo (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:17)
    at n.s.intermediateTransitionTo (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:8)
    at n.a.intermediateTransitionTo (ember_jquery-0ae86c6a7527a99c2b9b8a11521273bd9cb4f7d41bc546df081b7ee94f26d9c3.br.js:8)

Yep, it’s being treated like a permalink redirect and they’re not supported for internal links.

Unfortunately we had no way of knowing that this wasn’t officially supported behavior. As far as we were concerned, it worked. So we used it. I’ll try to let people know not to use that approach from now on, but unfortunately that doesn’t help us now when we have hundreds of these floating around.

As @Dannii said, it only breaks when it’s clicked to load in the same tab, and pretty badly. Even if it’s only really supported for when people do this by accident, doesn’t that still mean it should be fixed? Especially since it works when the topic is different.

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

Вы можете указать что угодно для заголовка, да. Однако это не так просто, как найти мои посты. В части нашего сообщества стало обычной практикой полностью удалять заголовок, чтобы избежать длинных URL-адресов. Из-за этого нескольким пользователям пришлось бы исправить все свои ссылки.

Почему это перенесли в раздел поддержки? Бесконечная загрузка страницы — это явно ошибка, даже если исправление не вернёт работоспособность ссылок без заголовков. И то, что это работает иногда (ссылки на другие посты; прямой ввод URL в адресной строке), но не в данном случае, по моему мнению, не имеет смысла.

Поскольку это проблема, требующая исправления из-за некорректного использования, она никогда не считалась поддерживаемой функцией. Баг — это сбой в работе функции, чего в данном случае не произошло.

Я также обновил заголовок, чтобы он отражал фактические события: ссылки не создаются без заголовка. Данная ситуация возникла потому, что ссылки либо вводились вручную, либо у них были удалены заголовки. Discourse не является источником проблемы ни в каком смысле, поэтому это не баг самой платформы Discourse.

Вы можете найти все битые ссылки за один раз, просмотрев свою базу данных. Пользователям не нужно возвращаться и исправлять их вручную, но вам обязательно нужно провести разъяснительную работу, чтобы предотвратить подобное в будущем.

Я не администратор, поэтому, к сожалению, не могу этого сделать.

Так что нормально, если страница будет вечно крутиться? Даже перенаправление на страницу 404 имело бы больше смысла, чем это.

Но это всё равно не решит вашу проблему, верно?

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

Как я уже говорил, использование только ID темы действительно является официально поддерживаемым форматом (для случая «ой, я забыл заголовок»), но комбинация ID темы и ID поста — нет.

Как ты думаешь, @eviltrout, каким должно быть поведение (см. третью ссылку в первом сообщении)?

О, это интересно. Какова причина такого разного подхода? Разве не бывает ситуаций, когда люди всё ещё забывают заголовок, но им важен конкретный пост?

Это довольно неприятный обходной путь, поскольку мы рассматриваем текст как число. По сути, это «вау, пользователь действительно запутался, полагаю, мы сделаем всё возможное» — аварийный выход. Он не предназначен для использования в качестве основного метода навигации, на который люди должны полагаться, особенно когда задействованы также идентификаторы постов.

Обнаружение происходит только при клике на ссылку? Можно ли обнаруживать это при создании поста и добавлять класс к любым некорректным или плохо оформленным ссылкам?

Если это так важно для вашего сообщества, почему администраторы здесь не обсуждают это? Именно им в конечном итоге нужно будет применять любые исправления.

Интересно, что серверная часть обрабатывает это. Существует специальный маршрут для /t/:topic_id/:post_number.

Сопоставление происходит только тогда, когда topic_id и post_number являются числовыми значениями. В этом случае система найдёт правильный слаг темы и выполнит перенаправление туда.

Поскольку это поддерживается на стороне сервера, я считаю, что мы должны реализовать поддержку и на стороне клиента. Бессмысленно показывать страницу ошибки, когда можно выполнить AJAX-запрос для получения правильного слага и отобразить его. Тем не менее, я бы не рекомендовал использовать такие ссылки, так как этот дополнительный запрос — лишняя нагрузка на сервер без особой пользы.

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

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

Вот, посмотрите мою новую игру!

Не совсем, так как можно нажать кнопку «Назад».

Вы хотели назначить эту задачу кому-то @eviltrout?

У меня не работает…

После перехода по неработающей ссылке перестают функционировать:

  • кнопка «Назад» в браузере
  • логотип
  • заголовок темы
  • поиск
  • пункты «Последние», «Непрочитанные», «Теги» и другие из меню-гамбургера

Единственное, что помогает — это нажать на уведомление или обновить страницу.