web-dev-qa-db-ja.com

わかりやすいURLの安全な文字

記事を掲載するウェブサイトを作成する必要があります。たとえば、ページのURLなど、わかりやすいURLを作成したいと思います。

タイトル:記事のテスト

http://www.example.com/articles/article_testになります。

もちろん、?#などのタイトルからいくつかの文字を削除する必要がありますが、どの文字を削除するのかわかりません。

誰かが安全に保持できるキャラクターを教えてもらえますか?

153
Paulo

RFC 3986 のセクション2.3を引用するには:

「URIで許可されているが予約されていない目的の文字は、非予約と呼ばれます。これらには、大文字と小文字、10進数、ハイフン、ピリオド、アンダースコア、およびチルダが含まれます。」

ALPHA  DIGIT  "-" / "." / "_" / "~"

RFC 3986には、古い RFC 2396 よりも少ない予約句読点がリストされていることに注意してください。

187
Skip Head

注意する必要がある2つの文字セットがあります:予約済みおよび安全でない

予約済み文字は次のとおりです。

  • アンパサンド( "&")
  • ドル( "$")
  • プラス記号( "+")
  • コンマ ("、")
  • スラッシュ( "/")
  • コロン( ":")
  • セミコロン( ";")
  • 等しい( "=")
  • 疑問符( "?")
  • 「@」記号(「@」)
  • ポンド( "#")。

一般的にnsafeと見なされる文字は次のとおりです。

  • スペース (" ")
  • より小さいおよびより大きい( "<>")
  • 開き括弧と閉じ括弧( "[]")
  • 中括弧の開閉( "{}")
  • パイプ( "|")
  • バックスラッシュ( "\")
  • キャレット( "^")
  • パーセント( "%")

私は1つ以上を忘れているかもしれません、それは私にカールVの答えをエコーすることにつながります。長い目で見れば、許可された文字の「ホワイトリスト」を使用し、サーバーやシステムで許可されていない文字に遅れを取らないようにするよりも、文字列をエンコードする方がよいでしょう。

101
Gary.Ray

特定の文字(ブラックリスト)を削除するのではなく、一部の文字(ホワイトリスト)のみを保持するのが最適です。

適切にエンコードすれば、技術的に任意のキャラクターを許可できます。しかし、質問の精神で答えるには、次の文字のみを許可する必要があります。

  1. 小文字(大文字を小文字に変換)
  2. 数字、0から9
  3. ダッシュ-またはアンダースコア_
  4. ティルド〜

他のすべては潜在的に特別な意味を持っています。たとえば、+を使用できると思うかもしれませんが、スペースに置き換えることができます。 &も、特に書き換えルールを使用する場合は危険です。

他のコメントと同様に、詳細については標準と仕様を確認してください。

39
carl

常に安全

これらは(理論上/仕様上)安全であり、基本的にはドメイン名を除くすべての場所です。
リストされていないものはすべてパーセントエンコードしてください。

    A-Z a-z 0-9 - . _ ~ ( ) ' ! * : @ , ;

時々安全

特定のURLコンポーネント内で使用される場合のみ安全です。注意して使用してください。

    Paths:     + & =
    Queries:   ? /
    Fragments: ? / # + & =

決して安全ではない

URI仕様(RFC 3986)によると、他のすべての文字はパーセントエンコードする必要があります。これも:

    <space> <control-characters> <extended-ascii> <unicode>
    % < > [ ] { } | \ ^

最大の互換性が懸念される場合は、文字セットをA-Z a-z 0-9-_に制限してください。
(ファイル名拡張子のピリオドのみ)。

25
Beejor

RFC3986-Uniform Resource Identifier(URI):Generic Syntax を見ると、質問はURIのpathコンポーネントを中心に展開しています。

    foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

セクション3.3を引用すると、URI segmentの有効な文字はpcharタイプです。

pchar =未予約/ pctエンコード/サブデリム/ ":"/"@"

内訳は次のとおりです。

ALPHA / DIGIT / "-" / "." / "_" / "~"

pct-encoded

"!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

":" / "@"

または、言い換えれば、 ASCIIテーブルexcept/?#[および]の任意の(非制御)文字を使用できます。 。

この理解は RFC1738-Uniform Resource Locators(URL) によって裏付けられています。

16
Philzen

未予約= ALPHA/DIGIT/"-"/"。"/"_"/"〜"

12
LKK

あなたが説明する文脈から、あなたが実際に作ろうとしているのは「SEOナメクジ」と呼ばれるものだと思います。これらの一般的なベストプラクティスは次のとおりです。

  1. 小文字に変換
  2. A-zおよび0-9以外の文字シーケンス全体を1つのハイフン(-)(アンダースコアではない)に変換します
  3. URLから「ストップワード」を削除します。つまり、「a」、「an」、「the」のような意味のない索引付け可能な単語です。広範なリストのGoogleの「ストップワード」

そのため、例として、「コミックでのSりを表すための!@%$ *の使用」というタイトルの記事は、「usage-represent-swearing-comics」のスラッグを取得します。

11
chaos

URIの形式は RFC 3986 で定義されています。詳細については、セクション3.3を参照してください。

6
joschi

SEOの観点からは、ハイフンはアンダースコアよりも優先されます。小文字に変換し、すべてのアポストロフィを削除してから、英数字以外の文字列をすべて単一のハイフンに置き換えます。開始点と終了点で余分なハイフンを削除します。

6
mpen

私は同様の問題を抱えていたので、きれいなURLを持ちたいと思っていましたが、URLには文字、数字、および_のみを許可する必要があるという結論に達しました。それで問題ありません。ニースの正規表現をいくつか書いたところ、すべてのUTF8文字が.NETの文字ではなく、ねじ込まれていることを認識しました。これは、.NET正規表現エンジンの既知の問題のようです。 SOこのソリューションに到達しました:

private static string GetTitleForUrlDisplay(string title)
{
    if (!string.IsNullOrEmpty(title))
    {
        return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
    }
    return string.Empty;
}


/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for unicode chars, because
/// .NET impl of regext do not handle unicode chars. So we use char.IsLetterOrDigit() which works nicely and we 
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
    string x = m.ToString();
    if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
    {
        return x.ToLower();
    }
    else
    {
        return "-";
    }
}
3
Lubomir Toshev

Ajax/phpを介して値をURLに返していたときに、URLを安全なURLにエンコードすると、ページによって再度読み取られるので非常に便利です。

特殊文字&のURLエンコーダーを使用したPHP出力

//PHP returning the sucess info of ajax request
echo "".str_replace('&','%26',$_POST['name'])." category was changed";

//javascript sending the value to url
window.location.href='time.php?return=updated&val='+msg;

//javascript/php executing the function printing the value of the url,
//now with the text normally lost in space because of the reserved & character.

setTimeout("infoApp('updated','<?php echo $_GET['val'];?>');",360);

誰もが私の小さなコードの抜粋が役立つことを願っています! :)

1
DIY-Forum

「URLエンコード」のようなものを探していると思います-Webで使用するのに「安全」であるようにURLをエンコードします:

以下がそのためのリファレンスです。特殊文字が必要ない場合は、URLエンコードを必要とするものをすべて削除します。

http://www.w3schools.com/TAGS/ref_urlencode.asp

0
Andy White