Php 生产上的Laravel4:403在ajax调用更新时禁止出现错误
我有一个laravel 4应用程序,它可以正常使用laravel进行保存。“常规保存”意味着我不是使用ajax调用URL来保存表单中的数据,而是使用laravel到URL/revocable/users/page/1/update的路径 仅在对url进行ajax调用时,我收到一个403禁止错误: /可撤销/用户/页面/1/更新 这是失败的: 我想这是我的apachehttpd.conf的虚拟主机设置。收到403错误时,我没有virtualhost文件 我尝试使用以下内容创建virtualhost文件:Php 生产上的Laravel4:403在ajax调用更新时禁止出现错误,php,jquery,ajax,apache,laravel,Php,Jquery,Ajax,Apache,Laravel,我有一个laravel 4应用程序,它可以正常使用laravel进行保存。“常规保存”意味着我不是使用ajax调用URL来保存表单中的数据,而是使用laravel到URL/revocable/users/page/1/update的路径 仅在对url进行ajax调用时,我收到一个403禁止错误: /可撤销/用户/页面/1/更新 这是失败的: 我想这是我的apachehttpd.conf的虚拟主机设置。收到403错误时,我没有virtualhost文件 我尝试使用以下内容创建virtualhos
<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
选项索引跟随符号链接多视图
允许超越所有
命令允许,拒绝
通融
ErrorLog/usr/local/apache/domlogs/secure.myultratrust.com.errors
但问题是一样的。我读到这可能是一个跨站点脚本错误。但它在同一个域上。所有这些代码都在我的本地机器上使用WAMP运行良好。所以我认为这是一个vhost配置问题
哦,我必须提到,laravel应用程序位于子目录中,而不是以“传统”的方式放置在子域的根目录中
如何解决这个问题
非常感谢和祝福[编辑]
只是一张便条,我想我是在Prabhakaran回复之前发布的。但我认为,这仍然为某人或我自己解决这个问题提供了更清晰的思路。我祈祷这件事能尽快解决。:)
这不是答案,但可能有助于得出答案。:)
我达到了某种程度的理解。当我单击“保存”按钮时,表单会在POST请求中保存数据。此帖子的URL是
Laravel路由工作,并保存数据
但是,当我通过“save an continue”按钮保存数据时,该按钮执行$.ajax
调用,但仍然指向同一个POST URL,Apache突然抱怨找不到404错误
页面
同样的文件和Laravel应用程序在使用2.4的我的WAMP上工作
我的WAMP本地服务器中有:
服务器名l4信任
服务器别名l4机密
DocumentRoot“C:\wamp\www\test\trunk\php\l4-confide\public”
SetEnv应用程序_ENV“开发”
DirectoryIndex.php
所有选项都包括索引
选项索引跟随符号链接多视图
要求所有授权
但我的生产服务器使用Apache2.2。“要求所有人都被授予”的等价物是什么?但我不确定这是否能解决问题。我想知道为什么Apache抱怨在
$.ajax
调用中没有发现404错误,而在以“常规”方式(即通过HTML发布)提交表单(即保存表单)时没有发现404错误。我想问题出在url:'/revocable/users/page/1/update'
假设您的页面中有
使用相关的urlrevocable/users/page/1/update
,那么ajax请求可能是,如果您在页面中,那么请求将是
所以你找不到合适的页面来处理请求
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升级:
另外,在.htaccess(2.2和2.4)中有一些不同之处,但我不确定这个问题是否与之相关。Hi,感谢您的回复。顺便说一句,我从elance看到了您的个人资料消息。我将$.ajax调用中的URL更改为完整URL
http://secure.myultratrust.com/test/revocable/users/page/1/update
但问题是一样的。我甚至试过/revocable/users/page/1/update
,但都没用。URL/revocable/users/page/1/update
(没有完整的URL)在我的WAMP上工作,尽管我认为它是Apache。我得到了$ajax reponse 404页面未找到,这是Apache的响应。在上面的ajax调用中,您没有提到类型为post
,请确保在表单中附加了序列化csrf。它是PUT
,但我也将其更改为post
。是的,附加了_标记。但它仍然不起作用。但是,为什么在进行任何更改之前,它都能在我的WAMP本地服务器上工作呢。我认为唯一改变的因素是生产服务器,404错误是Apache的错误。所以我仍然认为这是Apache的问题(产品版本为2.2)。关于URL引用,您的路径是正确的。但是URL不能是绝对路径。我试过了。(见上面我的更新)。我认为我的问题是,我认为URL应该与请求页面的位置相关,但事实并非如此。URL是相对于根域的,因此对于子域,它可以正常工作,但当应用程序位于子目录中时,URL需要包含根域之后的任何内容。因此,在我的例子中,'/test/revocable/users/page/1/update'
是传递给$.ajax的正确URL。谢谢Jesse。我的代码中已经有了它:$.ajaxSetup({headers:{'X-CSRF-Token':$('meta[name=“\u-Token”]')).attr('content')})代码>我尝试了你的代码,但仍然不起作用:(我更新了我的答案。感谢您提供这些参考。Apache config和.htaccess中的所有选项都可能有点太多。现在有点晚了,但是如果您希望添加更多信息,您应该编辑您的问题。
<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>
var csrf = $('meta[name=_token]').attr('content');
$.ajaxSetup({
beforeSend: function(request) {
return request.setRequestHeader('X-CSRF-Token', csrf);
}
});