繁体   English   中英

Laravel 4量产:Ajax调用中的403禁止错误以进行更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM