Laravel 4 on production:403禁止更新ajax调用错误

时间:2015-02-12 22:46:00

标签: php jquery ajax apache laravel

我有一个laravel 4应用程序,只需使用laravel进行常规保存即可正常工作。 “常规保存”意味着我没有使用ajax调用URL来保存表单中的数据,而是使用laravel的路由到URL / revocable / users / page / 1 / update。

在仅对网址的ajax调用期间,我收到了403禁用错误: /撤销/用户/页面/ 1 /更新

这里失败了:

$.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的虚拟主机设置。当我收到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。所以我认为这是一个vhost配置问题。

哦,我必须提一下,laravel应用程序位于子目录中,而不是以“传统”方式放置在子域的根目录中。

如何解决此问题?

非常感谢和祝福&lt;&gt;&lt ;, 维克多

已更新

这么简单的修复。我需要更新相对URL。

将提交到$ .ajax的网址从'/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必须具有开头/正斜杠。我尝试了./,我尝试了没有正斜杠,但那些没有用。

4 个答案:

答案 0 :(得分:0)

[EDITED] 只是一个注释,我以为我在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发布)。

答案 1 :(得分:0)

我想问题出在网址:&#39; / revocable / users / page / 1 / update&#39;,

假设您在页面http://localhost/something/中 并使用相关网址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

所以你不会在那里找到正确的页面来处理请求。

答案 2 :(得分:0)

var csrf = $('meta[name=_token]').attr('content');

        $.ajaxSetup({
            beforeSend: function(request) {
                return request.setRequestHeader('X-CSRF-Token', csrf);
            }
        });

将var csrf设置为csrf变量。我的网站将其全局存储在元

答案 3 :(得分:-1)

Apache 2.2中的“需要所有授权”等效于:

订单允许,拒绝 允许所有

检查Apache升级: http://httpd.apache.org/docs/2.4/upgrading.html

此外,.htaccess(2.2 vs 2.4)存在一些差异,但我不确定问题是否与之相关。