如何在 Symfony 中检查绝对 paths/routes?
How to check for absolute paths/routes in Symfony?
首先感谢您花时间解决这个困难的话题。
目标:
我的 URL 结构就像 facebook/twitter: site.com/Username
为了让用户设置用户名,我需要检查路由的路径是否与用户名匹配。
可能性与问题:
如果有人感兴趣,我想出的可能解决方案:
1.) 使用 getRouteCollection()
问题:不应使用此方法,因为它会重建路由缓存并降低性能(参见 https://github.com/symfony/symfony-docs/issues/6710)
2.) 在用户(用户名)实体中使用黑名单作为 RegExp 将所有站点列入黑名单,如 "settings"、"about"、"login"、"register"。 ..
* @Assert\Regex(pattern="/^(?!register)(?!login)...
问题:这几乎可以保证爆炸,因为有时忘记将 URL 添加到此 RegExp
3.) 使用 CURL 来检查站点。com/username 是否导致 404
问题:这对我来说似乎是"hack",不专业。
问题:
检查路由是否不存在的专业、安全的方法是什么,以便可以设置用户名并保证为 "free"(通过像 site.com/Username 这样的绝对路径并且没有其他路径)?
例如 $app->hasURL('/username')
添加:use \Symfony\Component\RoutingException\ResourceNotFoundException;
然后,$router
是路由服务,您可以尝试将 url 与路由匹配。如果它不匹配任何东西,它会抛出异常,但如果你有一个默认的包罗万象的路由,它总是会匹配一些东西,所以你只需要检测它是否匹配包罗万象:
$routeIsAvailable = false;
try {
$route = $router->match( '/' . $username );
// If you are using a catch-all route to load profiles
if ( $route[ '_route' ] === 'name_of_catch_all_route' )
$routeIsAvailable = true;
} catch ( ResourceNotFoundException ) {
// If the url didn't match any route at all
$routeIsAvailable = true;
}
确保先验证 $username
,这样它就不会包含 ?
或 /
等任何字符。您也可以 urlencode
它,但您可能不希望您的用户个人资料 url 中包含编码字符,因此最好只限制有效的用户名。
首先感谢您花时间解决这个困难的话题。
目标:
我的 URL 结构就像 facebook/twitter: site.com/Username
为了让用户设置用户名,我需要检查路由的路径是否与用户名匹配。
可能性与问题:
如果有人感兴趣,我想出的可能解决方案:
1.) 使用 getRouteCollection()
问题:不应使用此方法,因为它会重建路由缓存并降低性能(参见 https://github.com/symfony/symfony-docs/issues/6710)
2.) 在用户(用户名)实体中使用黑名单作为 RegExp 将所有站点列入黑名单,如 "settings"、"about"、"login"、"register"。 ..
* @Assert\Regex(pattern="/^(?!register)(?!login)...
问题:这几乎可以保证爆炸,因为有时忘记将 URL 添加到此 RegExp
3.) 使用 CURL 来检查站点。com/username 是否导致 404
问题:这对我来说似乎是"hack",不专业。
问题:
检查路由是否不存在的专业、安全的方法是什么,以便可以设置用户名并保证为 "free"(通过像 site.com/Username 这样的绝对路径并且没有其他路径)?
例如 $app->hasURL('/username')
添加:use \Symfony\Component\RoutingException\ResourceNotFoundException;
然后,$router
是路由服务,您可以尝试将 url 与路由匹配。如果它不匹配任何东西,它会抛出异常,但如果你有一个默认的包罗万象的路由,它总是会匹配一些东西,所以你只需要检测它是否匹配包罗万象:
$routeIsAvailable = false;
try {
$route = $router->match( '/' . $username );
// If you are using a catch-all route to load profiles
if ( $route[ '_route' ] === 'name_of_catch_all_route' )
$routeIsAvailable = true;
} catch ( ResourceNotFoundException ) {
// If the url didn't match any route at all
$routeIsAvailable = true;
}
确保先验证 $username
,这样它就不会包含 ?
或 /
等任何字符。您也可以 urlencode
它,但您可能不希望您的用户个人资料 url 中包含编码字符,因此最好只限制有效的用户名。