URLルーティング:フレンドリ URL を作成する際のスペースと不正な文字の処理

StackOverflow https://stackoverflow.com/questions/266719

  •  06-07-2019
  •  | 
  •  

質問

URL ルーティングに関する多くの議論と、たくさんの素晴らしい提案を見てきました...しかし、現実の世界では、私がまだ議論されていないことが 1 つあります。

  1. フレンドリーな URL の作成 スペースや不正な文字を含む
  2. DBへのクエリ

たとえば、医療サイトを構築しているとします。 記事 とともに カテゴリー そしてオプションの サブカテゴリ. 。(1 対多)。( どのような例でも構いませんが、医療分野には長い単語がたくさんあります。)


カテゴリ/サブ/記事構造の例:

  1. 一般的な健康状態 (カテゴリ)
    • 自然な健康 (サブカテゴリー)
      1. あなたの体の免疫システムと、それが助けを必要とする理由。 (記事)
      2. 植物やハーブが本当に解決策になるのでしょうか?
      3. 強化食品を食べるべきですか?
    • ホメオパシー医学
      1. ホメオパシー医学とは何ですか?
    • 健康的な食事
      1. 1日にコーヒーを10杯飲むべきですか?
      2. 有機野菜には価値があるのか​​?
      3. バーガーキング®は悪なのか?
      4. 「フレンチカフェ」とアメリカンコーヒーのどちらが健康に良いのでしょうか?
  2. 病気と症状 (カテゴリー)
    • 自己免疫疾患 (サブカテゴリー)
      1. 人の命を奪う最大の原因は何らかの病気です
      2. 助けを求める方法
    • 遺伝的条件
      1. 妊娠前に二分脊椎症を予防します。
      2. あなたは長生きする傾向がありますか?
  3. 博士。FooBar の個人的な提案 (カテゴリ)
    1. 漢方薬と自然療法についての私の考え (記事 - サブカテゴリなし)
    2. なぜ自分の健康に気を配る必要があるのでしょうか?
    3. 正しく食べて、良いダイエットをすることは可能です。
    4. 無輸血手術は時代を迎えたのでしょうか?

このような構造では、いくつかのものが得られます。 長い URL もしあなたが行くなら:/{カテゴリ}/{サブカテゴリ}/{記事タイトル}

この他にも、多数あります 不正な文字, 、 のように # !?「エ」など。

それで、質問は次のとおりです:

  1. 不正な文字やスペースはどのように処理しますか?(メリットとデメリットは?)
  2. データベースからこれを取得していただけますか
    • 言い換えれば、 DB を信頼して見つけてください タイトルを渡してアイテム、 またはすべてのタイトルを取得します コード内でキーを見つけて、データベースに渡すキーを取得します (データベースへの 2 回の呼び出し)。

注記:/products/beverages/Short-Product-Name/ のような素敵できれいな例をいつも目にしますが、醜い例をいくつか扱うのはどうですか ^_^

役に立ちましたか?

解決

スペースを削除する場合は、読みやすさの理由から(下線を _ の実質的にgo_awayに付けます)-私自身は_よりも好きです。

拡張文字、つまりüをキャストしてみてください。 、可能な限りアスキーに近い同等者に、つまり:

ü ->あなた

ただし、私の経験では、実際 SEO関連の問題の最大の問題は、URLにすべての素敵なテキストが含まれていることではなく、リンクを作成すると、インデックスに DEADLINKS が含まれるようになるため、SEOのすべての作業が不要になります。

このために、私はstackoverflowが何をするかを提案し、定数エンティティを参照する数値部分を持ち、残りのテキストを完全に無視します(および/または間違っている場合は更新します)

また、ひどくヘリカルな性質は、人間による悪い使いやすさをもたらします。人間は長いURLを嫌い。それらをコピーして貼り付けると、それらは壊れやすくなります。それをより低いレベルに分割できる場合、つまり

/article/1/Some_Article_Title_Here
/article/1/Section/5/Section_Title_Here
/section/19023/Section_Title_here  ( == above link ) 

この方法でブードゥーマジックを行う必要があるのは、番号付きの記事が実際に削除されたときだけです。このとき、テキスト部分を検索文字列として使用して、実際の記事を見つけます。それのようなもの。

他のヒント

最後のアプローチ:

  1. すべての「奇妙な文字」を変換する「通常の文字」へ-> àに、ñ nなどに
  2. すべての非単語文字を_に変換します(a-zA-Z0-9以外)
  3. アンダースコアのグループを単一のアンダースコアに置き換える
  4. すべての末尾および先頭のアンダースコアを削除する

ストレージに関しては、クールなURIは変わりません

解決策 2 は、それらの典型的なアプローチです。いくつかの改良が可能です。読みやすくするために、ダッシュの代わりにアポストロフィを何もしないようにします。通常は、「実際の」タイトルだけでなく、URL 有効性のために書き換えられたタイトルのバージョンもデータベースに保存し、インデックス付き SELECT WHERE を使用してアイテムを選択できるようにする必要があります。

しかし。URL パス部分を適切にエンコードしている限り、実際には不正な文字は存在しません。たとえば、スペース、ハッシュ、またはスラッシュは、%20、%23、または %2F としてエンコードできます。このようにしてエンコードすることが可能です どれでも 文字列を URL 部分に組み込むため、実際の変更されていないタイトルによってデータベースから SELECT で戻すことができます。

ただし、Web フレームワークによっては、これには潜在的な問題がいくつかあります。たとえば、CGI に基づくものは、エンコードされた %2F と実際の / の違いを見分けることができず、一部のフレームワーク/デプロイメントでは Unicode 文字の処理が困難になる可能性があります。

あるいは、簡単で安全な解決策は、URL に主キーを含め、単にアドレスを見やすくするためにタイトル部分を使用することです。例えば。:

http://www.example.com/x/category-name/subcat-name/article-name/348254863

このようにして、例えば。アマゾンはやってるよ。データベース内のタイトルを変更し、古いタイトルの URL を新しいタイトルに自動的にリダイレクトできるという利点があります。

誰かが興味がある場合。これは私が取っているルートです(oooh ... punny):

Route r = new Route("{country}/{lang}/Article/{id}/{title}/", new NFRouteHandler("OneArticle"));
Route r2 = new Route("{country}/{lang}/Section/{id}-{subid}/{title}/", new NFRouteHandler("ArticlesInSubcategory"));
Route r3 = new Route("{country}/{lang}/Section/{id}/{title}/", new NFRouteHandler("ArticlesByCategory"));

これにより、次のようなURLを実行できるようになります。

  • site.com/ca/en/Article/123/my-life-and-health
  • site.com/ca/en/Section/12-3/Health-Issues
  • site.com/ca/en/Section/12 /

URLをクリーニングするとき、アクセント付き文字を置き換えるために私が使用している方法を次に示します。

private static string anglicized(this string urlpart) {
        string before = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
        string  after = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";

        string cleaned = urlpart;

        for (int i = 0; i < avantConversion.Length; i++ ) {

            cleaned = Regex.Replace(urlpart, before[i].ToString(), after[i].ToString());
        }

        return cleaned;

        // Here's some for Spanish : ÁÉÍÑÓÚÜ¡¿áéíñóúü"

}

最も効率的な正規表現かどうかはわかりませんが、確かに効果的です。これは拡張メソッドであるため、呼び出すには、メソッドを静的クラスに入れて次のようにします。

string articleTitle = "My Article about café and the letters àâäá";
string cleaned = articleTitle.anglicized();

// replace spaces with dashes
cleaned = Regex.Replace( cleaned, "[^A-Za-z0-9- ]", "");

// strip all illegal characters like punctuation
cleaned = Regex.Replace( cleaned, " +", "-").ToLower();

// returns "my-article-about-cafe-and-the-letters-aaaa"

もちろん、これを&quot; CleanUrl&quot;という1つのメソッドに結合することもできます。または何かですが、それはあなた次第です。

フォローアップとして。いくつかのアイデアがあります。そのため、アイデアにコメントしたり、質問に独自の回答をしたりしてください:

解決策1:不正な文字をすべてダッシュに置き換えます:

  • www.mysite.com/diseases --- conditions / Auto-immune-disorders / the--1-killer-of-people-is-some-disease /

それは私には少しugいように見えます...

解決策2:不正な文字を削除し、スペースを単一のダッシュに置き換えます:

  • www.mysite.com/diseases-conditions/Auto-immune-disorders/the-1-killer-of-people-is-some-disease /

解決策3特定の文字を単語に置き換えるためのいくつかのルールを適用します。

  • www.mysite.com/diseases-and-conditions/Auto-immune-disorders/the-number1-killer-of-people-is-some-disease /

ソリューション#4すべてのスペースを取り除き、大文字を使用する

  • www.mysite.com/DiseasesAndConditions/AutoImmuneDisorders/TheNumber1KillerOfPeopleIsSomeDisease /

(大文字と小文字を区別するサーバーではうまく機能しない可能性があり、読みにくい)

Solution 2が私の推奨です。私は世界最大のSEO専門家ではありませんが、とにかく良いランキングを得るための「標準的な」方法だと思います。

通常は、合法的な文字のみを許可し、わかりやすいURLをできるだけ短くすることです。また、わかりやすいURLは人間によって挿入されることが多く、タイトルやコンテンツからわかりやすいURLを生成することはなく、そのURLを使用してデータベースを照会することも重要です。私はテーブルの列を使用しますfriendly_url。これにより、ウェブサイト管理者はわかりやすいURLを挿入できます。

データベースに追加の列(たとえば、タイトル列の横にUrlTitle)を追加し、「&amp;」ですべての不正な文字を取り除いたタイトルを保存することで、この問題を解決しました「and」で置き換えられた記号、および下線で置き換えられたスペース。次に、UrlTitleを使用して検索し、ページタイトルまたはどこでも実際のものを使用できます。

wordpress と同じことを行うことをお勧めします。短い単語を削除し、不正な文字をダッシュ​​ (最大 1 つのダッシュ) に置き換えてから、ユーザーが必要に応じて URL を修正できるようにします。URL を構成可能にしたほうが SEO にとっては良いことです。

Webデザイナーではなくクライアントユーザーとして、Firefoxは「違法」を置換しようとするとURLを壊すことがあります。使用可能なものと文字。たとえば、FFは〜を%7Eに置き換えます。それは私には決してロードされません。 HTMLエディターとブラウザーが、A〜Zおよび0〜9以外の文字を受け入れないことに単純に同意しない理由を理解できません。特定のスクリプトで%、?などが必要な場合は、スクリプトアプリケーションを変更して、英数字で動作するようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top