2009-10-19 22 views
10

我在將URL中的電子郵件地址傳遞給symfony應用程序時遇到了一些問題。Symfony:電子郵件地址作爲請求參數

的URL看起來像

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

它總是導致sfError404Exception,當週期被移除時除外。在做了一些Google搜索之後,我唯一看到的解決方案就是htaccess正在繞過網址,因爲這段時間是現在。然而,當我添加修復建議,以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] 

我會得到相同的404它也返回404當我在URL(example.com/index.php/unsubscribe/email/[email protected])直接使用前端控制器。我試圖將轉義版本直接放到地址欄中,例如example.com/unsubscribe/me%40example%2Ecom,這個方法可行,但只適用於firefox,其他地方不適用。

我已經花了大約2個小時在這個論壇上回答了Google地址,並且我正在用盡想法。

有什麼想法?

謝謝。

更新:這裏是routing.yml中的相關章節:

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(); 

11.

+0

+1,因爲我認爲我將運行到這個問題,以及 – 2009-10-19 20:32:18

回答

0

您的問題不適用於重寫規則。考慮到Symfony正在拋出異常,那麼這個請求就會把它交給Symfony。

你可以發佈異常的追蹤?如果你有sf_logging_enabled它應該記錄一些非常有用的信息來調試路由。

+0

我已經添加了跟蹤的問題身上。 – pivotal 2009-10-20 14:01:20

+0

嗯,看起來像它得到的網址確定。 sf_logging_enabled是否提供關於路線失敗原因的詳細信息? – six8 2009-10-20 16:19:56

3

我不知道你的Symfony在做什麼,但它可能有助於明確的是,下面是不是一個有效的URL:

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

什麼,你幾乎肯定希望(這是適用於所有瀏覽器!)是:

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

注意:@符號不安全,必須進行編碼。符號是安全的(RFC1738)。如果你不逃避@符號,它幾乎肯定會造成很大的麻煩,所以(幾乎肯定不會這樣做,但你不需要,所以我不會)。

由於在傳遞身份驗證參數(例如http://username:[email protected]/url/)時保留@作爲分隔符,因此不會轉義它而出現問題。有些URL分析器會發現,如果@發生在URL中的域之後,您確實需要輸入%40,但其他人則不會。

而不是靜態編碼@符號,您應該在電子郵件地址(例如「$ emailAddress = urlencode($emailAddress);」)上使用PHP的URL編碼功能之一,以確保地址中的其他字符也能正確轉義。不要猶豫,直到晚些時候或者'在你開始工作之後'離開它,從一開始就做,並保存你自己和最終用戶頭疼! :-)

注意:有幾種方法可以在PHP中對URL進行編碼,因此您需要閱讀urlencode()的文檔頁面,並將其與rawurlencode()等其他方法進行比較以確保它是您真正的想要你的情況。

+0

謝謝,我一直在計劃使用「@」的轉義版本,但遺憾的是,這對我來說似乎不是問題 - 無論是否逃避,未轉義或完全缺失,這段時間仍然設法拋出關閉symfony:/ – pivotal 2009-10-22 14:49:12

+0

啊有趣!我想你已經把它釘在那裏了。我看了一下,看起來這種情況發生在其他人身上,並且是一個「已知問題」 - 看起來像Symfony(或者他們推薦的)帶來的.htaccess配置。被解釋! 它似乎在回覆郵件在這裏: http://www.mail-archive.com/[email protected]/msg08689.html 因爲我不知道Symfony我可以如何沒有提供複製+粘貼示例,但是如何更改.htaccess修復它的意見很有意義 - 祝你好運! 8) – 2009-10-22 15:23:17

9

默認情況下,Symfony將./作爲參數分隔符。
這使得它非常容易搭配一個url像這樣:

/some/path/:param.:ext 

但不與電子郵件地址幫助。

幸運的是,您可以通過指定自己的模式來覆蓋.分隔符。
就在requirements行添加下面的路由:

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

在需求的.+是一個正則表達式匹配任何東西。 .匹配任何字符,並且+表示匹配一個或多個。

(在Symfony的1.4測試)

+0

+1好的答案! – 2010-08-25 22:26:02

+0

如果您在電子郵件地址後使用多個參數,您可以使用'[^ ​​\ /] +',以便它與路線中的斜槓不匹配。 – fyrye 2017-05-05 16:10:40

相關問題