Symfony3:开发时为 404,控制器响应为 PROD 时为 403
Symfony3: 404 on DEV, 403 on PROD WITH Controller Response
我很茫然...
我正在对 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
}
前端AJAXPOST
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
我意识到这个问题只发生在 HTML (Rich-Text) 在 POST 参数之一中发送时。该问题确实与 EasyApache 4 有关,其中 "ModSecurity" 规则给出误报。所以 403 是由 EasyApache 4 "ModSecurity" 生成的,因此禁止 POST 参数到达 Symfony。
我很茫然...
我正在对 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
}
前端AJAXPOST
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
我意识到这个问题只发生在 HTML (Rich-Text) 在 POST 参数之一中发送时。该问题确实与 EasyApache 4 有关,其中 "ModSecurity" 规则给出误报。所以 403 是由 EasyApache 4 "ModSecurity" 生成的,因此禁止 POST 参数到达 Symfony。