您需要生成URL的模板(不一定是有效URL本身,而是可以用于生成有效URL的模板)。您确切地知道需要替换的内容,可以确定它只会在一个地方发生,而且您知道所有内容都是安全的,因为您可以控制所有内容,而GoogleBot知道它要查找的内容(大概)。
在我们的结构化数据区域(在<head>
中,我们有此
"potentialAction": { "@type": "SearchAction", "target": "<%= search_url(search: {q: "{search_term_string}" }) %>", "query-input": "required name=search_term_string" }
观看“目标”。它以这种方式显示链接
它告诉我https://www.mywebsite.com/search?utf8=%E2%9C%93&search%5Bq%5D=%7Bsearch_term_string%7D
它不显示{或},但显示%7B和%7D
如何解决?
我已经尝试使用修复
"{search_term_string}".html_safe
或
"{search_term_string}".html_safe
或
%({search_term_string})
或
%({search_term_string}).html_safe
但什么都没有
在结构化数据区域(在]中),我们有以下“ potentialAction”:{“ @type”:“ SearchAction”,“ target”:“”,“ query -...
您需要生成URL的模板(不一定是有效URL本身,而是可以用于生成有效URL的模板)。您确切地知道需要替换的内容,可以确定它只会在一个地方发生,而且您知道所有内容都是安全的,因为您可以控制所有内容,而GoogleBot知道它要查找的内容(大概)。
我会继续手工修补编码:
search_url(search: { q: "{search_term_string}" }).sub('%7Bsearch_term_string%7D', '{search_term_string}')
如果您认为该模式将出现多次(极不可能),请使用
gsub
而不是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
您需要生成URL的模板(不一定是有效URL本身,而是可以用于生成有效URL的模板)。您确切地知道需要替换的内容,可以确定它只会在一个地方发生,而且您知道所有内容都是安全的,因为您可以控制所有内容,而GoogleBot知道它要查找的内容(大概)。