我在prod上遇到了Symfony2的问题。更具体地说,它是一个使用FosRestBundle构建的API,我的问题仅针对一个URL:api.domain.com/user/{id}。此服务返回具有给定{id}的用户的数据。路由中还有一个默认id = 0,以便在URL中未传递{id}时返回当前用户数据。
在开发中,一切运作良好。在prod上,我可以为某些用户获取数据,但不是全部。特别是/没有{id}的用户无法正常工作。但/ user / 0是正常的(在两种情况下都返回当前用户的数据)。 / 0 ok / 1 ok / 2 ok / 3 no,/ 4 ok ...等所有这些用户都存在,我无法理解为什么它返回未找到的404服务,这发生在控制器之前。
这可能是我的服务器(apache2.4)的错误配置,但我不这么认为/不知道在哪里。重写工作,清除缓存,路由器:调试在prod&开发等 但是,我在本地使用nginx,当我使用prod环境时我没有这个问题。这就是为什么我认为它可能依赖于我的远程apache服务器配置,但听起来很奇怪。我也在考虑一些学说问题。
也许有人有想法?
修改: 如果我用/ userr或/ xyz替换我的路由文件/用户,一切正常。这似乎是路线上的冲突。我有另一个/用户路线,但使用不同的方法,所以我不认为这来自于此。此外,将这两种模式改为/某种方式正在发挥作用。
我目前在prod上没有正常工作路线:
my_api_user_get:
pattern: /user/{id}.{_format}
defaults: { _controller: MyApiBundle:User:user, id: 0, _format: ~ }
requirements:
#here it's post because I pass some params in the body
_method: POST
id: \d+
my_api_user_delete:
pattern: /user.{_format}
defaults: { _controller: MyApiBundle:User:delete, _format: ~ }
requirements:
_method: DELETE
如果我更改/某些内容的模式,则所有内容都有效(my_api_user_get包含pattern: /something/{id}.{_format}
& my_api_user_delete with pattern: /something.{_format}
)
EDIT2 :对于以下3个路由器:匹配命令,我得到了相同的正确结果:
$ router:match /user --host="api.domain.com" --method="POST"
$ router:match /user/2 --host="api.domain.com" --method="POST"
$ router:match /user/3 --host="api.domain.com" --method="POST"
告诉我:
[router] Route "my_api_user_get"
Name my_api_user_get
Path /user/{id}.{_format}
Host api.domain.com
Scheme ANY
Method POST
Class Symfony\Component\Routing\Route
Defaults _controller: myApiBundle:User:user
_format: NULL
id: 0
Requirements id: \d+
Options compiler_class: Symfony\Component\Routing\RouteCompiler
Path-Regex #^/user(?:/(?P<id>\d+)(?:\.(?P<_format>[^/]++))?)?$#s
Host-Regex #^api\.domain\.com$#s
我也注意到这个问题出现在带有参数的其他路由上(但奇怪的是之前它没问题,我没有改变任何东西)。 +我看到有问题的网址,例如/ user / 3或/ user,它会生成重定向301 到/ user / 3 ** / **或/ user ** / **,而/ user / 1或/ user / 2正常工作。我不明白这个重定向来自哪里。
编辑3 这是一个Apache配置问题。我仍然不知道为什么它会像那样,但我有解决方案。具体来说,apache在某些网址上添加了一些内容,而在其他网址上则没有。为了解决这个问题,我在根部添加了一个.htaccess,其中包含以下信息:
Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /
DirectorySlash Off
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]