2009-10-19 16 views
10

URLに電子メールアドレスを渡して、symfonyアプリケーションに問題があります。それは、常に期間が除去された場合を除き、sfError404Exceptionになります symfony:リクエストパラメータとしての電子メールアドレス

example.com/unsubscribe/email/[email protected] 

よう

URLが見えます。いくつかのグーグル・グーグルをやった後、私が見た唯一の解決策は、期間が存在するためにhtaccessがURLをバイパスしていることです。私はそうのように、htaccessをに修正案を追加するときしかし、:

# we skip all files with .something 
RewriteCond %{REQUEST_URI} \..+$ 
RewriteCond %{REQUEST_URI} [email protected]+ #skip email address 
RewriteCond %{REQUEST_URI} \.epl$ 
RewriteCond %{REQUEST_URI} !\.html$ 
RewriteCond %{REQUEST_URI} !\.rhtml$ 
RewriteRule .* - [L] 

私は、URL(example.com/index.php/unsubscribe/email/[email protected])で直接フロントコントローラを使用する場合それはまた404を返すと同じ404を取得します。私は、アドレスバーに直接エスケープされたバージョンを入れようとしました。例えば、example.com/unsubscribe/me%40example%2Ecomとこれはうまくいきますが、Firefox以外ではどこにもありません。

私はこの時点でフォーラムのグーグル・グーグル・ジング地獄で約2時間を費やしてしまいました。アイディアが不足しています。

どのような考えですか?

ありがとうございました。

更新:

unsubscribeform: 
    url: /unsubscribe/email/:email 
    param: { module: subscribe, action: index } 

更新::スタックトレースは...そのは私

404 | Not Found | sfError404Exception 
Empty module and/or action after parsing the URL "/unsubscribe/email/[email protected]" (/). 
stack trace 

1. at() 
    in SF_SYMFONY_LIB_DIR/controller/sfFrontWebController.class.php line 44 ... 
      41. 
      42.  if (empty($moduleName) || empty($actionName)) 
      43.  { 
      44.   throw new sfError404Exception(sprintf('Empty module and/or action after parsing the URL "%s" (%s/%s).', $request->getPathInfo(), $moduleName, $actionName)); 
      45.  } 
      46. 
      47.  // make the first request 
2. at sfFrontWebController->dispatch() 
    in SF_SYMFONY_LIB_DIR/util/sfContext.class.php line 159 ... 
     156. */ 
     157. public function dispatch() 
     158. { 
     159.  $this->getController()->dispatch(); 
     160. } 
     161. 
     162. /** 
3. at sfContext->dispatch() 
    in /home/web/htdocs/index.php line 10 ... 
      7. require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'ProjectConfiguration.class.php'); 
      8. 
      9. $configuration = ProjectConfiguration::getApplicationConfiguration(SF_APP, SF_ENVIRONMENT, SF_DEBUG); 
      10. sfContext::createInstance($configuration)->dispatch(); 
に進むための任意の経路情報を得ていないように見えます。ここのrouting.ymlの関連セクションがあります

11.

+0

+1私は私も –

答えて

0

問題はリライトルールでは発生しません。 Symfonyが例外をスローしていることを考えれば、要求はSymfonyになります。

例外のトレースバックを投稿できますか?あなたがsf_logging_enabledを持っているなら、それはルーティングをデバッグするためのかなり有益な情報を記録するべきです。

+0

この問題に実行していることと思うように私は疑問本体にトレースを追加しました。 – pivotal

+0

うーん、それはOKのURLを取得するように見えます。 sf_logging_enabledはルートが失敗した理由についての詳細を提供しますか? – six8

3

私はあなたがsymfonyにおいて何をしているかわかりませんが、それは次のように有効なURLではないことを明確にすることに役立つことがあります。

example.com/unsubscribe/email/[email protected] 

あなたはほぼ確実にしたい(これはすべてのために真でありますブラウザ:)は、

http://example.com/unsubscribe/email/me%40example.com 

注:@記号は安全ではないため、コード化する必要があります。記号は安全ですが(RFC1738)。 @記号をエスケープしないと、ほとんどの場合大きな問題が発生します(エスケープすることはほとんどありませんが、そうする必要はありません)。

認証パラメータを渡す際に@がセパレータとして予約されているため(例:http://username:[email protected]/url/)、エスケープしないと問題が発生します。 URLのドメインの後ろに@がある場合、%40と入力することを実際に意図していたURLパーサーもありますが、そうでないものはありません。

だけではなく、あなたがメールアドレス(例えば、「$ EMAILADDRESS = urlencode($emailAddress);」)上のPHPのURLエンコード機能のいずれかを使用する必要があり、静的に@記号をコードするアドレス内の他の文字を確実にするためにも適切にエスケープされています。後でこれを残すか、「仕事をした後に」これを最初からやり直して、自分自身とエンドユーザに頭痛をかけないように誘惑しないでください! :-)

NB:URLをPHPでエンコードするにはいくつかの方法がありますので、urlencode()のドキュメントページを読み、rawurlencode()のような他のアプローチと比較して本当にあなたの場合に欲しい。

+0

ありがとう、私はエスケープされたバージョンの "@"を使用することを計画していましたが、悲しいことに、私にとって問題ではないようです - アンパサンドがエスケープされているか、エスケープされていないか、 symfonyから:/ – pivotal

+0

ああ、面白い!私はあなたがそこに釘付けになっていると思う。私は一見して、これは他の人に起こり、 "既知の問題"であるようです - Symfonyに付属している.htaccess設定のように思われます(または、彼らが推奨している)。解釈される!どのようにsymfonyの私ができる http://www.mail-archive.com/[email protected]/msg08689.html 私は知らないとして: ここはポストへの返信でカバーしているように見えますコピー+貼り付けの例を挙げてはいませんが、.htaccessを変更して返信で修正する方法の提案は意味があります - 幸運を祈る! 8) –

9

デフォルトでは、symfonyはパラメータセパレータとして./を扱います。

/some/path/:param.:ext 

しかし、電子メールアドレスには役立ちません。そうのようなURLを一致させることが非常に容易になり

幸いにも、.セパレータを独自のパターンを指定して変更することができます。
ちょうど下のあなたのルーティングにrequirementsの行を追加します。

unsubscribeform: 
    url: /unsubscribe/email/:email 
    param: { module: subscribe, action: index } 
    requirements: { email: .+ } 

要件で.+が何かにマッチする正規表現です。 .は任意の文字と一致し、+は1つ以上の文字と一致します。

(symfony 1.4でテスト済み)

+0

+1すてきな答え! –

+0

電子メールアドレスの後ろに複数のパラメータを使用する場合は、 '[^ \ /] +'を使用してルート内のスラッシュと一致しないようにすることができます。 – fyrye

関連する問題