2013-01-10 4 views
6

私はmod_rewriteとAkelos Frameworkから抽出したルーティングシステムを使用しています。書き換えエンジンを使用しているときにURLを正しくエンコードする

検索キーのパラメータにいくつかの記号を使用すると、大きな問題が発生します。

ルーティングマップは以下の通りです:コントローラで

$map->connect(":lang/search/:string", array('controller' => 'search','action' => 'index')); 

は今、私は、検索キーワードとして$this->registry->map['params']['get']['string']を取得します。

URLを正しくエンコードする方法が見つかりません。たとえばのは、t\ /#%&=

urlencode()

rawurlencode()t%5C%20%2F%23%25%26%3D与え、ページが同じ表示t%5C+%2F%23%25%26%3Dとページが表示さThe requested URL /site/en/search/t\+/#%&= was not found on this server.を与える文字列を取りましょう。

あなたは、私が本当にURLとあなたが何を読み取ることができませんそれによって、このようなエンコーディングのためにbase64を使用したくないhere on this page

ルータクラスのソースをダウンロードしたり、閲覧することができます。場合

あなたがここに必要がある場合は、同様に.htaccessファイルの内容です:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

更新

Here are actually working files for making tests.

あなたは時間があれば、サーバー上のこれらのファイルとテストをダウンロードしてください。

ガイド:

controllerclass.php - シンプルなコントローラのフレームワークは、それに「コントローラ」クラスを定義することにより、

routerclass.phpを動作するようにsearchcontroller.phpを可能にします - Akelosフレームワークから抽出されたルータクラス、バグがある可能性がありそこ

routes.php - 我々の場合には、我々は唯一の/search/:string

を持っているあなたは、あなたの敗走を定義する場所、

searchcontroller.php - 文字列をテストするための基本的なアプリケーション - /このファイル

index.phpに検索/ stringhereポイント - 私は、エラーがここに

ではないと思います - すべての開始およびルーティングは

.htaccessを開始するために起こります

私はバグがにおそらくある

searchcontroller.phproutes.phpcontrollerclass.php、あなたが index.phpに変更を加える必要はないだろうと思いまたはおそらく、私が信じていない .htaccessに必要な修正があります。

+1

「B」フラグと「NE」フラグをそれぞれ単独で組み合わせて組み合わせてみてください。 –

+0

同じですが、結果はありませんでした。 – Davit

+0

私はBフラグだけを追加するので、 '[QSA、L、B]' – Gerben

答えて

1

与えられたエラーは次のとおりです。

"要求されたURL/サイト/EN /検索/"

あなたが言及されていない余分な言葉、それの 'サイト' を持っていますあなたの質問では、難読化することができますが、エラーはApache ではなく、 PHPから来ているようです。

エラーは、URLがhtaccessルールによって一致していないことを示しています。したがって、エラーを特定するためにPHPコードを調べる必要はありません。エラーはApacheのどこかにあります。

Searching further - これはURLが無効なためです。 %2fはクエリ文字列では使用できますが、パスでは使用できません。無効なため、サーバーは書き換えルールにヒットする前にサーバーを拒否しています。

www.jampmark.comへのリンクは、それぞれのソリューションで5つのソリューションの利点と問題点を示していますが、ここに多くの資料をコピーすることは不適切です。

  1. "AllowEncodedSlashes" ディレクティブをオンには、Apache
  2. URLエンコード後%の255Cとダブルでurlencodeを%252Fと%5Cと%2Fを交換してください)
  3. 利用エンコードされていないスラッシュ
  4. はスラッシュを交換してください

    :アンダースコア(_)

また、であなたのテストコードにエラーがあると

$string[2] = "t\ /#%&="; 

スラッシュスペースは有効なエスケープシーケンスではありません。コードを "t \\ /#%& ="に変更するか、バックスラッシュがエスケープ文字として解釈されないようにします。

+0

私は実際に集めて、実際のアプリケーションの外でテストするためにこれらのファイルをまとめました。そして ':lang/search /:string'はファイルとは関係のない実際のウェブサイト上の私の場合です。 – Davit

+0

はい、私はそれについて前に読んだので、助けにはなりませんでした。私はスラッシュをアンダースコアに置き換えたくありません。私はmod_rewriteなしで私のアプリケーションを動作させることができますが、URLは醜いです。私はrouterclass.phpにエラーがあると思うので、現在のapache設定を使ってアプリケーションを書くことができます。これは、スラッシュやURL内の数字記号(#)などの文字を完全に動作させるためのものです。ありがとう。 – Davit

+0

あなたは働いていると思われるスラッシュを含むURLを表示できますか? あなたの例では、スラッシュが動作しなかったのは、Apacheがスラッシュを気に入らないのとまったく同じです。 – Danack

2

urlencodeurldecodeについては、RFC 3986 Section 7.3 (Back-End Transcoding)と思われます。私は少しhttp://php.net/manual/en/function.urlencode.php#97969で機能を変更した:

function myUrlEncode($string) { 
    $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%5C', '%3F', '%25', '%23', '%5B', '%5D'); 
    $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "\\", "?", "%", "#", "[", "]"); 
    return htmlspecialchars(str_replace($entities, $replacements, urlencode($string))); 
} 

注意を%5C =>\htmlspecialchars()(はhtmlspecialcharsの添加は、セキュリティではなく、特殊文字を使用することができることについてです入力が<script>...<h1>...などもあります。: ))。

だからあなたが好き、それを使用することになります。

print("<b><i>URL Encode Tests</i></b><br /><br /> 
    <b>Works:</b> ".myUrlEncode($string[0])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[0])."\">/search/".myUrlEncode($string[0])."</a><br /> 
    <b>Does not work:</b> ".myUrlEncode($string[1])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[1])."\">/search/".myUrlEncode($string[1])."</a><br /> 
    <b>Does not work:</b> ".myUrlEncode($string[2])." <a href=\"".HTTP_ROOT."/search/".myUrlEncode($string[2])."\">/search/".myUrlEncode($string[2])."</a><br /> 
"); 

ことをやった後、検索文字列#3(\ /#%&=)は、「メソッドSearchControllerのようなPHPのエラーが発生します::トンはでは無効です... \ index.php on line 30 "を参照してください。私はこれがルーターの正規表現についてだと思いますので、そこでいくつかの調整を行う必要があります。

+0

urlパラメータとして検索クエリを使用すると、通常の 'urlencode'ですべて正常に動作することに注意してください。 '/ search /?q = ...' –

+0

"検索文字列#3(\ /#%&=)はPHPエラーを示します" - その文字列は二重引用符で囲まれているため無効です。 -spaceは、認識されないエスケープシーケンスです。 – Danack

+0

@ダナックは、コントローラでエラーがキャッチされていて、OPがそれらの文字をキャッチしたいので、ルータの正規表現の調整によって、これらのような文字の配列が広くなることが想定されます。 –

関連する問題