[英]Laravel 4 on production: 403 forbidden error on ajax call to update
我有一个laravel 4应用程序,可以在laravel进行定期保存的情况下正常运行。 “常规保存”表示我不是在使用ajax来调用URL来保存表单中的数据,而是使用laravel的URL到/ revocable / users / page / 1 / update的路由。
仅在对URL的ajax调用期间出现403禁止错误:/ revocable / users / page / 1 / update
这里失败了:
$.ajax({
type: action,
cache: false,
dataType: 'json',
url: '/revocable/users/page/1/update',
data: {
'oSerializeArray': [array]
},
beforeSend: function() {
}
})
.done( function( data, text, jqxhr ) {
data.success;
//data.iPersonsPK;
window.location.replace(sUrlEdit);
})
.fail( function ( data, jqxhr ) {
data.success;
})
.always( function ( data ) {
data.success;
})
return false;
我认为这是我的Apache httpd.conf的virtualhost设置。 出现403错误时,我没有虚拟主机文件。
我试着用这个创建一个虚拟主机文件:
<Directory "/home/myultrat/public_html/secure/test/*">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog /usr/local/apache/domlogs/secure.myultratrust.com.errors
但是问题是一样的。 我读到它可能是跨站点脚本错误。 但这是在同一个域上。 所有这些代码在使用WAMP的本地计算机上都能正常运行。 所以我认为这是一个虚拟主机配置问题。
哦,我不得不提到laravel应用程序位于子目录中,而不是以“传统”方式放置在子域的根目录中。
我该如何解决这个问题?
非常感谢和祝福,维克多
更新
这样简单的修复。 我需要更新相对URL。
将提交给$ .ajax的URL从'/revocable/users/page/1/update'
更改为'/test/revocable/users/page/1/update'
解决了该问题。 @ prabhakaran8737在URL路径不正确的情况下部分正确。 但是(就像我在他的回答的评论中提到的那样),一直以来,我都认为URL是相对于发出请求的位置(即'/test/revocable/users/page/1/update'
),但是$ .ajax将URL调用视为基于其根域。 因此,我需要将URL修改为基于根目录并相应地进行更改(即'/test/revocable/users/page/1/update'
)。
我也尝试使用绝对URL,但这似乎也不起作用。 因此,从根来的相对URL是答案。 并且相对URL必须以开始/
正斜杠。 我尝试了./
并且也尝试了不使用正斜杠的方式,但是这些都不起作用。
[编辑]只是一个注释,我以为我在Prabhakaran回应之前就发布了此内容。 但这仍使我想让某人或我自己进一步解决该问题。 我祈祷这很快就解决。 :)
这不是答案,但可能有助于得出答案。 :)
我已经有了一定的了解。 当我单击“保存”按钮时,该表单将数据保存在POST请求中。 该POST URL为http://secure.myultratrust.com/test/revocable/users/page/3/update
Laravel路由有效,并保存数据。
但是,当我通过“保存继续”按钮保存数据时,该按钮执行$.ajax
调用,但仍对同一POST URL Apache突然发现找不到404 error
页面。
相同的文件和Laravel应用程序适用于使用2.4的WAMP。
我在WAMP本地服务器中有这个:
<VirtualHost *:80>
ServerName l4-confide
ServerAlias l4-confide
DocumentRoot "C:\wamp\www\test\trunk\php\l4-confide\public"
SetEnv APPLICATION_ENV "development"
<Directory "C:\wamp\www\test\trunk\php\l4-confide\public">
DirectoryIndex index.php
Options All Includes Indexes
Options Indexes FollowSymLinks MultiViews
Require all granted
</Directory>
</VirtualHost>
但是我的生产服务器使用Apache 2.2。 等同于“要求全部授予”? 我不确定这是否可以解决问题。 我想知道为什么Apache抱怨仅在$.ajax
调用中找不到404错误,而不是在以“常规”方式(即通过HTML进行POST)提交(即保存)表单时却抱怨不到。
我猜问题出在网址:“ / revocable / users / page / 1 / update”,
假设如果您在页面http:// localhost / something /中并使用相关的URL revocable/users/page/1/update
那么ajax请求可能是http:// localhost / something / revocable / users / page / 1 / update ,如果您在http:// localhost / another /页面中,则请求将
http:// localhost / another / revocable / users / page / 1 / update
因此,您将找不到正确的页面来处理请求。
var csrf = $('meta[name=_token]').attr('content');
$.ajaxSetup({
beforeSend: function(request) {
return request.setRequestHeader('X-CSRF-Token', csrf);
}
});
将var csrf设置为您的csrf变量。 我的网站将其全局存储在meta中
与Apache 2.2中的“要求所有被授予的权限”等效:
订单允许,全部拒绝
检查Apache升级: http : //httpd.apache.org/docs/2.4/upgrading.html
另外,.htaccess文件也有一些区别(2.2 vs 2.4),但是我不确定该问题是否与此有关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.