我正在laravel 4.2中构建一个restful api。我在本地机器上开发了api,它运行得很好。但是,当我将其迁移到实时服务器时,HTTPPOST和PUT请求返回了以下异常:
Symfony'Component'HttpKernel'Exception'NotFoundHttpException
这是我的路线文件。
Route::group(['prefix' => 'api/v1'], function(){
Route::post('login', ['as' => 'api.v1.users.login', 'uses' => 'UsersController@login']);
Route::delete('logout', ['as' => 'api.v1.users.logout', 'uses' => 'UsersController@destroy']);
Route::post('register', ['as' => 'api.v1.users.register', 'uses' => 'UsersController@register']);
Route::put('change-password', ['as' => 'api.v1.users.change.password', 'uses' => 'UsersController@update']);
Route::post('forgot-password', ['as' => 'api.v1.users.forgot.password', 'uses' => 'UsersController@forgotPassword']);
Route::get('recover/{code}', ['as' => 'api.v1.users.recover', 'uses' => 'UsersController@recover']);
});
我运行
php artisan routes
| POST api/v1/login | api.v1.users.login | UsersController@login
| DELETE api/v1/logout | api.v1.users.logout | UsersController@destroy
| POST api/v1/register | api.v1.users.register | UsersController@register
| PUT api/v1/change-password | api.v1.users.change.password | UsersController@update
| POST api/v1/forgot-password | api.v1.users.forgot.password | UsersController@forgotPassword
| GET|HEAD api/v1/recover/{code} | api.v1.users.recover | UsersController@recover
它显示了uri及其相关的控制器和方法。我想不通这个问题。我们需要为实时服务器重新配置laravel吗?我使用POSTMAN作为休息客户。
此外,公用文件夹的.htaccess文件在活动服务器中不起作用。我必须写类似的url
http://somedoman.com/index.php/api/v1/login
而不是
http://somedoman.com/api/v1/login
当.htaccess存在于公用文件夹中时,它为什么不起作用?mod_rewrite已启用。我还将AllowOverride None更改为AllowOverrideAll。
这是公用文件夹.htaccess的内容。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
我遇到了类似的问题,我尝试了这个破解。它对我来说就像一种魅力。在过滤器中添加此代码。
App::before(function($request){
header('Access-Control-Allow-Origin: http://www.example.com');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization');
if (Request::getMethod() == "OPTIONS") {
$headers = array(
'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers'=> 'X-Requested-With, content-type',);
return Response::make('', 200, $headers);
}
});
别忘了我用angular作为前端,我在每次请求时都添加了这个
app.config(["$httpProvider",function($httpProvider){
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.interceptors.push('myHttpInterceptor');
}]);