Symfony2 - 404用于某些URL使用Apache,Nginx确定

时间:2014-11-25 20:03:43

标签: php apache symfony routing

我在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]

0 个答案:

没有答案