私のレールアプリはRDiscountを使用してユーザー提供のマークダウンテキストからHTMLを生成しており、アンカータグにrel = "nofollow"がないことに気付きました。私のアプリは一般に公開されているので、これは大きな問題です。 nofollowリンクを有効にする方法はありますか、それともより良い解決策がありますか?RDiscount出力にnofollowリンクを生成する
ありがとうございます!
私のレールアプリはRDiscountを使用してユーザー提供のマークダウンテキストからHTMLを生成しており、アンカータグにrel = "nofollow"がないことに気付きました。私のアプリは一般に公開されているので、これは大きな問題です。 nofollowリンクを有効にする方法はありますか、それともより良い解決策がありますか?RDiscount出力にnofollowリンクを生成する
ありがとうございます!
これは、Kramdown(これは拡張構文のルビーMarkdownパーサー)でのみ可能だと思います。あなたは、リンクに示すように、ということだろう。
[link](test.html){:rel='nofollow'}
平均時間では、私はRDiscount出力を再解析し、各アンカーにREL =「nofollowを」を追加することによって、このハックを使用しています:
def markdown(input)
html = RDiscount.new(input).to_html
doc = Nokogiri::HTML::DocumentFragment.parse(html)
doc.css("a").each do |link|
link['rel'] = 'nofollow'
end
doc.to_html
end
これは実際にマークダウンパーサーによって処理されるべきだと思いますが、
私は同様のことをする必要がありました。すべてのリンクにtarget="_new"
を追加してください。 KramdownとカスタムKramdown::Converter::Html
クラスを使用して解決しました。
私もアプリ/ヘルパー/ application_helper.rb
理想的def markdown(str)
Kramdown::Converter::MyHtml.convert(Kramdown::Document.new(str).root)[0].html_safe
end
でビューヘルパーを持っているKramdown::Converter::Html
サブクラス(一部の自動ロードパスでkramdown/Aコンバータ/ my_html.rb)
class Kramdown::Converter::MyHtml < Kramdown::Converter::Html
def convert_a(el, indent)
el.attr['target'] = '_new'
super
end
end
を定義しますKramdown::Document.new(str).to_my_html.html_safe
を使用するだけでいいですが、Kramdownがconst_defined?
を使用してコンバータが使用可能で、オートローダーを起動していないかどうかを確認するために、レール開発モードで動作させることはできません。これを修正する方法がわかっている場合はコメントしてください。
このようにしてリンクの変更をサポートするRDiscountにはfeature requestが公開されています。
これは、今後のRDiscount 2.1.5.xリリースの1つに予定されています。
実際にはコンテンツはユーザーによって提供されるため、SEOスパムを阻止する手段として、すべてのリンクに自動的にrel = "nofollow"を追加する方法が必要です。私はstackoverflowそれを行うと思います。 – widgetycrank
入力していただきありがとうございます。 – widgetycrank