为什么HTTP在公共文件夹的laravel和.htaccess文件中请求POST和PUT,这在本地机器中很好,而在实时服


Why HTTP request POST and PUT in laravel and .htaccess file of public folder, that works great in local machine, not working in live server?

我正在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');

}]);