Php 获取从中进行重定向的Url

Php 获取从中进行重定向的Url,php,symfony,redirect,http-referer,referer,Php,Symfony,Redirect,Http Referer,Referer,我使用的是symfony框架和FOS用户包 我的网站上有一个显示文章内容的URL。对于这个url,我与ArticleVoter进行了一次安全检查,如果用户未登录,将抛出AccessDenied异常 (你可能会问自己“为什么我不把url放在我的主防火墙后面?”。因为,对于某些文章,url对于未登录的用户是可访问的,它取决于我的文章实体的某些属性,这是当ArticleVoter进来时,为了检查这些属性) 然后我有一个AccessDeniedSubscriber,它实现了EventSubscriber

我使用的是symfony框架和FOS用户包

我的网站上有一个显示文章内容的URL。对于这个url,我与ArticleVoter进行了一次安全检查,如果用户未登录,将抛出AccessDenied异常

(你可能会问自己“为什么我不把url放在我的主防火墙后面?”。因为,对于某些文章,url对于未登录的用户是可访问的,它取决于我的文章实体的某些属性,这是当ArticleVoter进来时,为了检查这些属性)

然后我有一个AccessDeniedSubscriber,它实现了EventSubscriberInterface,如下所示(为了清晰起见,简化了版本):

因此,发生的情况是,一个匿名(未连接)用户试图访问url,ArticleVoter抛出AccessDeniedExpetion,其投票方法将返回拒绝访问,然后用户被重定向到my_登录路径

在我的登录路径上,我试图确定用户最初从哪个路径重定向。登录路由的关联控制器方法如下所示:

public function loginAction(Request $request, AuthenticationUtils $authenticationUtils)
{
     $referer = $request->headers->get('referer');

     ... handle login rendering ...
}
不幸的是,referer总是空的。我理解这一点,因为它是服务器端重定向,而不是通过点击链接或javascript进行重定向

所以我的问题是,在重定向到登录页面之前,如何获取用户试图访问的初始url? 在我的情况下,这将与正确的文章id

精度:要回复@RyanNerd的答案,请在下面找到var_dump($request->headers)的结果:


如您所见,在“cookie”值中,提到了“sf_redirect”,也许有某种方法可以检索上一个URL,因为上一个路由是用这个字符串(“%22article_view%”)编写的?

当您重定向到登录页面时,添加一个GET参数
redirect
from
以页面URL为值,因此,登录成功后,您可以重定向到该URL。

异常编程是一条黑暗而危险的道路。也就是说,
var\u dump($request->headers)
看起来像什么?是否返回了其他标题?这可能为“referer”为什么为空提供了线索。thx@Ryanner为了您的回答,我在顶部的问题中添加了var_转储的结果
public function loginAction(Request $request, AuthenticationUtils $authenticationUtils)
{
     $referer = $request->headers->get('referer');

     ... handle login rendering ...
}
object(Symfony\Component\HttpFoundation\HeaderBag)#73 (2) { ["headers":protected]=> array(13) { ["host"]=> array(1) { [0]=> string(9) "localhost" } ["connection"]=> array(1) { [0]=> string(10) "keep-alive" } ["upgrade-insecure-requests"]=> array(1) { [0]=> string(1) "1" } ["user-agent"]=> array(1) { [0]=> string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" } ["accept"]=> array(1) { [0]=> string(124) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" } ["sec-fetch-site"]=> array(1) { [0]=> string(4) "none" } ["sec-fetch-mode"]=> array(1) { [0]=> string(8) "navigate" } ["sec-fetch-user"]=> array(1) { [0]=> string(2) "?1" } ["sec-fetch-dest"]=> array(1) { [0]=> string(8) "document" } ["accept-encoding"]=> array(1) { [0]=> string(17) "gzip, deflate, br" } ["accept-language"]=> array(1) { [0]=> string(23) "fr,en-US;q=0.9,en;q=0.8" } ["cookie"]=> array(1) { [0]=> string(561) “MY_SESSION_NAME_SESS=qih0m4nlmi5enljsni5lphkf9m; sf_redirect=%7B%22token%22%3A%22821c13%22%2C%22route%22%3A%22article_view%22%2C%22method%22%3A%22GET%22%2C%22controller%22%3A%7B%22class%22%3A%22AllArticle%5C%5CWebBundle%5C%5CController%5C%5CArticle%5C%5CArticleController%22%2C%22method%22%3A%22viewAction%22%2C%22file%22%3A%22%5C%2FUsers%5C%2Fjohn_fly%5C%2FallArticle%5C%2Fsrc%5C%2FAllArticle%5C%2FWebBundle%5C%2FController%5C%2FArticle%5C%2FArticleController.php%22%2C%22line%22%3A244%7D%2C%22status_code%22%3A302%2C%22status_text%22%3A%22Found%22%7D" } ["x-php-ob-level"]=> array(1) { [0]=> string(1) "1" } } ["cacheControl":protected]=> array(0) { } }