Symfony的:电子邮件地址作为请求参数(Symfony: email address as re

2019-08-21 01:36发布

我在与一个URL传递一个电子邮件地址到symfony的应用中的一些问题。

该网址看起来像

example.com/unsubscribe/email/me@example.com

它总是会导致sfError404Exception ,当周期被移除时除外。 做了一些谷歌搜索周围后,我所见过的唯一的解决办法是,htaccess的是绕过,因为至今这一时期的URL。 然而,当我建议的修复添加到htaccess的,就像这样:

# we skip all files with .something
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !@.+    #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/me@example.com )。 我试着直接把转义版本到地址栏,如example.com/unsubscribe/me%40example%2Ecom这个工作,但只有在Firefox中,无处。

我花了在论坛上回答约2小时,在这一点上谷歌搜索地狱,我跑出来的想法。

有什么想法吗?

谢谢。

更新:这里是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/me@example.com" (/).
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。

Answer 1:

默认情况下,Symfony的对待./作为参数分隔符。
这使得它非常容易搭配一个url像这样:

/some/path/:param.:ext

但不与电子邮件地址帮助。

幸运的是,你可以重写. 指定自己的模式分隔符。
只需添加requirements下面的路由线路:

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

.+的要求是一个正则表达式匹配任何东西。 的. 匹配任何字符, +意味着匹配一个或更多的。

(在Symfony的1.4测试)



Answer 2:

我不知道你的Symfony在做什么,但它可能有助于明确的是,下面是不是一个有效的网址:

example.com/unsubscribe/email/me@example.com

你几乎可以肯定要什么(这是对所有的浏览器真的!)是:

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

注:符号@是不是安全的,必须进行编码的。 符号不过是安全的( RFC1738 )。 如果你不逃避@符号几乎肯定会引起大麻烦所以(逃避。几乎可以肯定不会,但你并不需要,所以我不会)。

(例如,问题就会因为与通过认证参数时@被保留作为隔板不逸出它发生://用户名:password@hostname.domain/url/ HTTP )。 有些URL解析器会制定出你的真正用意@如果URL中的域名后,会出现输入%40,而另一些则不会。

而不仅仅是编码@符号静态你应该使用PHP的URL编码功能之一上的电子邮件地址(例如“$ EMAILADDRESS = 用urlencode($)移转 ;”),以确保在地址其它字符也正确转义。 不要被诱惑离开这,直到后来还是“你得到它的工作后,”从一开始就做到这一点,并保存自己和最终用户头痛! :-)

注意:有几种方法来编码的URL在PHP中,所以你需要通过()的文档页面进行urlencode阅读,并与像rawurlencode其他方法相比(),以确保它就是你真的想在你的案件。



Answer 3:

你的问题是不是与重写规则。 考虑到Symfony的是抛出异常,则要求是使得人们Symfony的。

你能张贴异常的追溯? 如果你已经sf_logging_enabled应该日志调试路由一些非常有用的信息。



文章来源: Symfony: email address as request parameter