AJAX调用URL报错:Laravel调用同级sms.php路径错误如何修复?
这个问题很常见,核心原因是你写的请求路径是相对路径,导致浏览器错误地把localhost当成了当前Laravel服务路径的子目录,最终拼出了http://localhost:8000/localhost/sms.php这种错误地址。下面分两种常见场景给你具体的修复方法:
场景1:Laravel和sms.php都在Apache下运行(推荐)
如果你的Laravel是部署在XAMPP的Apache服务中(比如把Laravel的public目录设为Apache的子站点,或者整个Laravel项目在htdocs下),直接把AJAX的url改成根相对路径即可:
$.ajax({ url: '/sms.php', type: "get", data: {}, success: function(data){ alert('ok'); } });
这里的/代表XAMPP的网站根目录htdocs,所以请求会直接指向http://localhost/sms.php,路径就完全正确了。
场景2:用php artisan serve运行Laravel(端口8000)
这种情况下,Laravel的开发服务器和XAMPP的Apache服务是两个独立的服务,分别在8000和80端口,直接跨端口请求会触发浏览器的跨域拦截。你有两种解决方式:
方法A:切换到Apache运行Laravel
把Laravel部署到Apache下(比如配置虚拟主机,或者直接把Laravel放在htdocs下,访问http://localhost/laravel/public),之后就可以用场景1的根路径方法,避免跨域问题。
方法B:允许跨域请求并使用完整URL
如果坚持用php artisan serve,需要修改AJAX请求为完整URL,同时在sms.php中添加跨域允许的响应头:
首先修改AJAX代码:
$.ajax({ url: 'http://localhost/sms.php', type: "get", data: {}, success: function(data){ alert('ok'); } });
然后在sms.php的最开头添加以下代码,允许来自Laravel服务的跨域请求:
header("Access-Control-Allow-Origin: http://localhost:8000"); header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type");
最后别忘了检查一下sms.php的文件权限,确保XAMPP的Apache用户有读取该文件的权限哦。
内容的提问来源于stack exchange,提问作者Mujahidur Rahman Mithun IUB

