Горячо добавлять символы {или} в <% = search_url в заголовок - PullRequest
0 голосов
/ 09 мая 2020

В нашей области структурированных данных (в <head>) у нас есть это

"potentialAction": {
    "@type": "SearchAction",
    "target": "<%= search_url(search: {q: "{search_term_string}" }) %>",
    "query-input": "required name=search_term_string"
}

Watch "target". Он показывает мне ссылку таким образом

Он показывает мне https://www.mywebsite.com/search?utf8=%E2%9C%93&search%5Bq%5D=%7Bsearch_term_string%7D

Он не показывает {или}, но% 7B и% 7D

Как решить ?

Я уже пытаюсь исправить, используя

"{search_term_string}".html_safe

или

"&#123;search_term_string&#125;".html_safe

или

%({search_term_string})

или

%(&#123;search_term_string&#125;).html_safe

но ничего

1 Ответ

0 голосов
/ 09 мая 2020

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

Я бы go заранее исправил кодировку вручную:

search_url(search: { q: "{search_term_string}" }).sub('%7Bsearch_term_string%7D', '{search_term_string}')

Если вы думаете, что шаблон будет появляться более одного раза (что маловероятно), используйте вместо этого gsub of sub.

Вы также можете более четко указать, что вы делаете:

.sub('%7Bsearch_term_string%7D') { |encoded| URI.decode(encoded) }

Или поместите все это в помощник (скажем, search_url_for_microdata), чтобы вы могли оставьте себе в будущем записку о том, почему вы это делаете:

# Untangle URL encoding issues with json+ld microdata for GoogleBot.
def search_url_for_microdata
  search_url(search: { q: '{search_term_string}' })
    .sub('%7Bsearch_term_string%7D') { |encoded| URI.decode(encoded) }
end

или даже:

# Untangle URL encoding issues with json+ld microdata for GoogleBot.
def search_url_for_microdata
  decoded = '{search_term_string}'
  encoded = URI.encode(decoded)
  search_url(search: { q: decoded }).sub(encoded, decoded)
end

или:

DECODED = '{search_term_string}'
ENCODED = URI.encode(DECODED)

# Untangle URL encoding issues with application/ld+json microdata for GoogleBot.
def search_url_for_microdata
  search_url(search: { q: DECODED }).sub(ENCODED, DECODED)
end
...