【问题标题】:Symfony3: 404 on DEV, 403 on PROD WITH Controller ResponseSymfony3:DEV 上的 404,带有控制器响应的 PROD 上的 403
【发布时间】:2018-03-08 11:40:03
【问题描述】:

我很茫然……

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

几点说明:

1) 代码在我的本地主机上完美运行。该问题仅发生在我们的生产服务器上。 Security.yml 设置正确,并且我已停用自定义 ExceptionListener。 PROD 上的 404 NOT FOUND 错误是标准的 Apache 404,而不是 Symfony 404 “Route Not Found”。但是,当我启用自定义 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

【问题讨论】:

    标签: .htaccess symfony easyapache-4


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多