以下のSO投稿は包括的ですが、説明されている3つの方法はすべて、期間のエンコードに失敗します。
たとえば、3つのメソッド(escape、encodeURI、encodeURIComponent)を実行した場合、いずれもピリオドをエンコードしません。
そのため、「food.store」は「food.store」として表示され、URLが破損します。 RailsアプリはURLを有効なものとして認識できず、404エラーページを表示するため、URLが破損します。おそらく、Rails routesファイル?
URLのJavascriptでピリオドをエンコードする最良の方法は何ですか?
ピリオドはURLを壊すべきではありませんが、どのようにピリオドを使用しているのかわかりませんので、私は本当に言うことはできません。私が知っている関数はどれも「。」をエンコードしませんURLの場合、「。」をエンコードするには独自の関数を使用する必要があります。
データをbase64でエンコードすることもできますが、jsでネイティブに行う方法はないと思います。また、クライアント側とサーバー側の両方で、すべてのピリオドをASCII同等(%2E))に置き換えることもできます。
基本的に、「。」をエンコードする必要は通常ないため、必要な場合は独自のソリューションを考え出す必要があります。 「。」を確認するために、さらにテストを行うこともできます。実際にURLを壊します。
hth
これは古いスレッドであることは知っていますが、元の問題を引き起こしているURLの例はここにはありませんでした。数日前にJavaアプリケーションで同様の問題が発生しました。私の場合、ピリオドの文字列はURLのパス要素の最後にありました。
http://myserver.com/app/servlet/test.string
この場合、私が使用しているSpringライブラリは、その文字列の「テスト」部分をコントローラクラスの関連する注釈付きメソッドパラメータに渡すだけでした。離れて。おそらく、これは上記の元の問題と同じ根本的な問題ですか?
とにかく、URLに末尾のスラッシュを追加するだけで、この問題を回避できました。他の人に役立つ場合に備えて、これを捨ててください。
ジョン
.htaccessがで入力値を壊していたのと同じ問題がありました。 .htaccessが実行していたことを変更したくないので、これを使用して修正しました。
var val="foo.bar";
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E');
これにより、すべての標準エンコードが実行され、が置き換えられます。 asciiに相当する%2Eがあります。 PHPは自動的に$ _REQUEST値の。に変換されますが、.htaccessはそれをピリオドとして認識しないため、すべてが良好です。
期間をURLにエンコードする必要はありません。 ここ は調べるRFCです。
ピリオドが何かを「壊す」場合、サーバーがURLの独自の解釈を行っている可能性がありますが、これはもちろん素晴らしいことですが、独自のメタキャラクターをエスケープする必要があります。
私は同じ質問をしました、そしておそらく私のソリューションは将来他の誰かを助けることができます。
私の場合、URLはjavascriptを使用して生成されました。 URL内の値を区切るにはピリオドが使用されるため( スリングセレクター )、セレクター自体にピリオドを含めることは許可されませんでした。
私の解決策は、すべての期間をそのままHTMLエンティティに置き換えることでした図1:
図1:ソリューション
var urlPart = 'foo.bar';
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.'));
console.log(safeUrlPart); // foo%26%2346%3Bbar
console.log(decodeURIComponent(safeUrlPart)); // foo.bar
.htaccessファイルの使用が可能であれば、本当にクールで簡単になります。ピリオドの前に\を追加するだけです。何かのようなもの:\.
これはRails問題、 Rails RESTルーティング:リソース項目IDのドット を参照してください(Railsルーティングガイド、セクション3.2)
残りのAPI URLで.sに問題がありました。それらが拡張として解釈されるという事実は、それ自体が理にかなっています。エスケープは、呼び出しの前にエスケープされていないため、役に立ちません(既に述べたように)。末尾の/を追加しても解決しませんでした。代わりに名前付き引数として値を渡すことでこれを回避しました。例えばapi/Id/Text.stringからapi/Id?arg = Text.string。コントローラーのルーティングを変更する必要がありますが、ハンドラー自体は同じままでかまいません。