4

私は、人々が独自の翻訳者を作成できるWeb サイトを開発しています。彼らは URL の名前を選択できます。それはデータベースに送信され、.htaccess を使用してリダイレクトしますwebsite.com/nameoftheirtranslator

に:

website.com/translator.php?name=nameoftheirtranslator

これが私の問題です:

最近、誰かが名前に特殊文字を含む翻訳者を作成したことに気付きました -> "LAEFÊVËŠI"。

しかし、それが処理され (php ファイルにポストされ、次にmysqli_real_escape_string)、データベースに追加されると、単純に "LAEFVI" として表示されるため、特殊文字がどこかで失われていることがわかります。

ここで何をすべきかはよくわかりませんが、2つの方法があると思います。

  1. 文字を保持し、いくつかのエンコードを実行してみてください (どこから始めればよいかわかりません)
  2. それらを捨てて、翻訳者の名前に「通常の」文字のみを使用するようにユーザーに伝えます(理想的ではありません)

次のようなURLを持つことさえ可能かどうか疑問に思っていwebsite.com/LAEFÊVËŠIます-それはサーバーによって解釈できますか?

EDIT1:スタック オーバーフローが、まさにこの質問で、タイトルの特殊文字を.../using-special-characters-in-urls!に変換することに気付きました。これは素晴らしい解決策のように思えます。â などの特殊文字を通常の文字 (â など) に変換する関数を作成できると思います。/#@"',&そして、私は?のような他の文字を無視すると思います。考えてみると、このような問題を回避するためのかなり標準的で実践的な戦略がいくつかあるに違いありません。

EDIT2: 実際、今考えてみると(もっと)-このことを(英語だけでなく)あらゆる言語の人々が使用できるようにしたいので、URLに特殊文字を使用できるようにしたいと本当に思っています. そうは言っても、Google は として解釈しないことがわかりました。そのâため、文字を通常の文字に翻訳しないと、翻訳者aを見つけるのに苦労する可能性があります。LAEFÊVËŠIああ!

4

1 に答える 1

1

さて、そのクレイジーなエピソードの後、何が起こったのですか:

  • PHP で英数字以外の文字をすべて削除していることがわかりましたpreg_replace()
  • preg_replaceスペースのみを削除して使用するように変更されましたrawurlencode()

$name = mysqli_real_escape_string($con, rawurlencode( preg_replace("/\s/", '', $name) ));

  • 現在、すべてがデータベースにエンコードされ、安全で健全です。
  • この書き換えルールを使用RewriteRule ^([^/.]+)$ process.php?name=$1 [B]
  • 「ページが見つかりません」というメッセージが表示されたため、書き直しが間違っていたと思いながら、2 時間ぐるぐる回っていました。
  • で読むprocess.php必要がなかったことを実現します。rawurlencode()name

$name = rawurlencode($_GET['name']);

今では動作します。

うわー!

睡眠時間。

于 2013-06-27T17:02:28.093 に答える