2009-10-19 91 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

相关问题