Symfony3:DEV上的404,带有控制器响应的PROD上的403

时间:2018-03-08 11:40:04

标签: .htaccess symfony easyapache-4

我不知所措......

我正在为Symfony做一个AJAX POST。在PROD环境(app.php)中,我得到403 FORBIDDEN状态代码(用户确实有访问权限),但响应中包含一个错误消息,该消息是在控制器内为其中一个为空的POST参数生成的。我已确定$ request-> request-> all()为空。切换到DEV环境(app_dev.php)我收到404 NOT FOUND响应。在PROD和&amp ;;上浏览路线DEV不提供403或404响应。 AJAX POST是同一台服务器(没有跨域问题),而且AJAX POST的路由是由Symfony生成的。

几点说明:

1)代码在我的localhost上完美运行。该问题仅发生在我们的生产服务器上。 Security.yml设置正确,我已经停用了自定义ExceptionListener。 PROD上的404 NOT FOUND错误是标准的Apache 404,而不是Symfony 404“找不到路由”。但是,当我启用我的自定义ExceptionListener时,我得到了404响应,而不是Apache 404。

2)我们的托管服务提供商将我们的生产服务器从EasyApache 3升级到EasyApache 4.随之而来的一些PHP配置设置也发生了变化。我不得不让它们在PHP配置中重新启用SOAP和iconv。因为它在我的本地主机上完美运行,我推断它与此有关,但我将不得不指出确切的问题,以便能够解决它。我怀疑.htaccess设置(RewriteMod)中的某些内容,但我对此并不了解。

3)有一百种不同的路由链接到控制器功能,其中90%是通过AJAX POST访问的。除了这一个(我们到目前为止已经找到),它们都能完美地工作。

控制器功能:

/**
 * @Route("/secured/helpdesk/save", name="saveTicket")
 */ 
public function saveTicketAction(Request $request = null) 
{   
    $data = $request->request->all();

    if (empty($data['message'])) return $this->createJsonResponse(array('error' => 'No Ticket Description or Message Provided', 'data' => $data));  

     ... 
     The function is quite large, so I am not going to paste the whole thing, the error message above is what I receive along with the 403 response in PROD

}

前端AJAX POST

function saveTicket()
{
    $.ajax({
        url: '{{ url("saveTicket") }}',
        method: 'POST',
        async: true,
        data: $('#messageForm').serialize()
    })
    .done(function(data)
    {
        if (typeof(data.error) != 'undefined')
        {
            $('#errorMsg').html(data.error);
            $('#pageError').modal('show');
        }
        else
        {
            $('#successMsg').html('Helpdesk Ticket Successfully Saved.');
            $('#pageSuccess').modal('show');
            window.location = '{{url('helpdeskAdmin')}}';
        }
    });
    return false;
}

security.yml

security:
role_hierarchy:
    ROLE_SUPERADMIN:        ROLE_ACCOUNTADMIN
    ROLE_ACCOUNTADMIN:      ROLE_USER

providers:
    main:
        entity:
            class: AppBundle\Entity\User
            property: email

firewalls:
    secured_area:
        pattern:    ^/
        anonymous:  ~
        form_login:
            login_path:  login
            check_path:  login
            default_target_path: portalDashboard
            require_previous_session: false
            success_handler: authentication_handler
            failure_handler: authentication_handler
        logout:
            path:   /logout
            target: /
        http_basic:
            realm: "Smarttrace Portal"  
encoders:
    AppBundle\Entity\User: sha512

access_control:
    - { path: ^/superadmin, roles: ROLE_SUPERADMIN }
    - { path: ^/accountadmin, roles: ROLE_ACCOUNTADMIN }
    - { path: ^/secured, roles: ROLE_USER }
    - { path: ^/payfast, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }

的routing.yml

app:
   resource: "@AppBundle/Controller/"
   type:     annotation

logout:
   path: /logout

1 个答案:

答案 0 :(得分:0)

我意识到只有在其中一个POST参数中发送HTML(Rich-Text)时才会出现此问题。这个问题确实与EasyApache 4有关,其中" ModSecurity"规则给出误报。所以403是由EasyApache 4" ModSecurity"生成的。因此禁止POST参数到达Symfony。