6

私はmod_rewriteとAkelosFrameworkから抽出されたルーティングシステムを使用しています。

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

ルーティングマップは次のとおりです。

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

コントローラでは$this->registry->map['params']['get']['string']、検索キーワードとして取得します。

URLを正しくエンコードする方法が見つかりません。たとえば、文字列を見てみましょうt\ /#%&=

urlencode()与えるt%5C+%2F%23%25%26%3Dとページ表示The requested URL /site/en/search/t\+/#%&= was not found on this server.

rawurlencode()与えるt%5C%20%2F%23%25%26%3Dとページは同じように表示されます。

このページでルータークラスのソースをダウンロードまたは表示できます

私は本当に、URLや何も読めないようなエンコーディングにbase64を使用したくありません。

ここで必要な場合は、.htaccessファイルの内容もあります。

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

アップデート

これが実際にテストを行うための作業ファイルです。

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

ガイド:

controllerclass.php-シンプルなコントローラーフレームワーク。クラス「Controller」を定義することにより、searchcontroller.phpが機能できるようにします。

routerclass.php-Akelos Frameworkから抽出されたルータークラス、バグはおそらくそこにあります

routes.php-あなたがあなたのルートを定義する場所、私たちの場合は/search/:string

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

index.php-すべての開始とルーティングが発生する場所

.htaccess-ここにエラーはないと思います

index.php、、、controllerclass.phpを変更する必要はないroutes.phpと思いますsearchcontroller.php

バグが発生している可能性があります。または、私が信じていないrouterclass.php修正が必要な場合もあります。.htaccess

4

2 に答える 2

2

問題は、 および に関するRFC 3986 セクション 7.3 (バックエンド トランスコーディング)に関するもののようです。http://php.net/manual/en/function.urlencode.php#97969の関数を少し変更しました。urlencodeurldecode

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 ( \ /#%&=) は、"Method SearchController::t is invalid in ...\index.php on line 30" のような PHP エラーを返します。これはルーターの正規表現に関するものだと思いますので、そこでいくつかの調整を行う必要があるかもしれません.

于 2013-01-13T15:09:15.280 に答える
1

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

「要求された URL /サイト/en/search/」

質問に記載されていない「サイト」という余分な単語が含まれているため、解釈が難しくなりますが、エラーはPHPではなくApacheから発生しているようです。

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

さらに検索しています - URL が有効でないためです。%2f はクエリ文字列では許可されていますが、パスでは許可されていません。無効であるため、サーバーは書き換えルールに達する前に拒否しています。

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

  1. Apache で「AllowEncodedSlashes」ディレクティブをオンにします
  2. URL エンコーディング後に %2F を %252F に、%5C を %255C に置き換えます
  3. ダブル urlencode()
  4. エンコードされていないスラッシュを使用する
  5. スラッシュをアンダースコア (_) に置き換えます

また、次のテスト コードにエラーがあります。

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

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

于 2013-01-13T13:26:45.973 に答える