簡體   English   中英

Laravel Ajax在共享主機上

[英]laravel ajax on shared hosting

我有一個部署在服務器上的laravel應用程序。

檔案結構

server
│

└───blog-app
│    │   app
│    │   bootstrap 
│    │   ......
│
└───public_html
    │    blog
    │     │─── index.php
    │

這就是我的結構。 到目前為止,一切似乎都工作正常,但是現在我試圖對控制器函數進行AJAX調用,但是它沒有正常工作。

讓我通過一個例子來解釋一下,

$.ajax({
     type:'POST',
     url:'{{route('blog.prefetchResults')}}',
     data:'_token = <?php echo csrf_token() ?>',
     success:function(data){
              $("#msg").html(data.msg);
           }
     });

這是我的AJAX調用都到路線blog.prefetchResults它指向駐留在控制器BlogController 但是,當我在瀏覽器控制台中查看時,會看到這種錯誤:

http://mysubdomain.com/blog/prefetchBlogController@prefetchResults 500(內部服務器錯誤)

我可以從該錯誤中推斷出,當發出客戶端請求時,它不允許我訪問這些目錄,這使我提出了一個非常簡單的問題:如果可以,我應該如何使用laravel發出AJAX請求?這樣做嗎?

更新(示例):

加載資源失敗:服務器響應狀態為500(內部服務器錯誤)

test.blade.php

@extends('main')
<p>
This is an ajxax test
</p>
<button class="butt">
    click me
</button>
<script>
    $().ready(function(){
        $('butt').on('click',function(){
                $.ajax({
                 type:'GET',
                 url:'{{route('blog.test')}}',
                 success:function(data){
                          $("p").html("somthing");
                       }
                 });
        })
    });
</script>

Web.php

//Test controller
Route::get('blog/test'.'BlogController@test')->name('blog.test');

BlogController

 public function test(){
       return view('test.test')->withMessage('changed');
    }

檔案結構

檔案結構

 server
    │

    └───blog-app //Not accessible through client side languages 
    │    │   app->Http->Controllers/BlogController.php
    │    │   resources->views->test->test.blade.php
    │    │  routes->web.php->route defined here
    │
    └───public_html(www folder)// accessible to the client (www.mydomain.com)
        │    blog
        │     │─── index.php
        │

@Alejandro回復

  • 解決了以上問題。
  • 對不起app->Http->BlogController.php ,它是app->Http->Controllers/BlogController.php

注意:

  • public_html目錄是根目錄,即mydomain.com的根點。

  • 因此普通用戶無法訪問其他文件夾(例如blog-app ),它們只能通過服務器端語言進行訪問。

日志文件

[2017-01-08 19:23:01] local.ERROR: exception 'ErrorException' with message 
'Trying to get property of non-object' in 
/home/mydomainuser/blogapp/storage/framework/views/af6b0045a9d30a80c19dd552032d46b39ad1cc99.php:1



Next exception 'ErrorException' with message 
'Trying to get property of non-object (View: /home/foodq7y4/blogapp/resources/views/blog/single.blade.php)' in 
/home/mydomainuser/blogapp/storage/framework/views/af6b0045a9d30a80c19dd552032d46b39ad1cc99.php:1

.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

Single.blade.php

 @extends('main')

@section('title', '| Blog')

@section('content')


    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1>Blog</h1>
        </div>
    </div>

    @foreach ($posts as $post)
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2>{{ ucwords($post->title) }}</h2>
            <h5>Published: {{ date('M j, Y', strtotime($post->created_at)) }}</h5>

            <p>{{ substr(strip_tags($post->body), 0, 250) }}{{ strlen(strip_tags($post->body)) > 250 ? '...' : "" }}</p>

            <a href="{{ route('blog.single', $post->slug) }}" class="btn btn-sm btn-primary">Read More</a>
            <hr>
        </div>
    </div>
    @endforeach

    <div class="row">
        <div class="col-md-12">
            <div class="text-center">
                {!! $posts->links() !!}
            </div>
        </div>
    </div>


@endsection

您是否嘗試過使用瀏覽器直接訪問URL? 假設您收到“ 500(內部服務器錯誤)”,我將首先檢查服務器日志。 但是,有些事情:

  • 您應該調用元素類: $('.butt') ,但是我想您已經明白了。

  • 您無需為GET請求傳遞csrf令牌。 除非您想自己進行一些驗證/授權。 對於POST請求,Laravel將檢查令牌。 您可以在帶有ajax選項headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'}的HTTP標頭中發送它headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'}

  • 如果要以純字符串形式發送數據,請刪除空格: data:'_token=<?php echo csrf_token() ?>' ,否則該字段最終被設置為_token_

  • 但是,我認為最好將請求數據設置為JS對象: {'_token': '{{ csrf_token() }}'}

  • 您說您的文件結構具有app->Http->BlogController.php 默認情況下,Laravel期望控制器位於app/Http/Controllers目錄中。

  • 控制器似乎返回了html字符串,因此data.msg可能返回undefined 相反, data是html字符串。

嘗試修復這些問題,然后評論或進行后續編輯。


更新:從服務器日志中我們發現問題出在views/blog/single.blade.php 您已經弄清楚它是$posts->links而且顯然不是對象。

在執行AJAX請求時,請記住始終使用response()->json()方法返回JSON響應,而不是像BlogController test()方法示例中那樣使用視圖。

另外,在管理面板中實現LogViewer之類的功能 (如果有),以查看日志文件並讀取發生的錯誤。 設置Bugsnag也不是一個壞主意。

在應用程序中,這非常有效。 像這樣更改代碼:

1.查看零件

<p id="response"></p>
        <button class="butt">
            click me
        </button>
        <script>
            $(document).ready(function(){
                $('.butt').on('click',function(){
                    $.ajax({
                        dataType:'HTML',
                        type:'GET',
                        url:'{{route('blog.test')}}',
                        success:function(data){
                            $("#response").html(data);
                        }
                    });
                })
            });
        </script>

2.控制器部分

    public function test()
    {
        return \View::make('test.test')->withMessage('changed');
        //or  return view()->withMessage('changed');
    }

對於功能打開的控制台,請單擊網絡,然后單擊按鈕,如果出現錯誤,它將顯示紅色鏈接。

  1. 點擊該鏈接
  2. 在控制台頂部的選項卡列表中,找到預覽(並且服務器端錯誤將顯示給您)。

祝好運

您的Javascript

將HTTP請求發送到實際路由而不是命名路由對我有用。

$().ready(function(){
    $('.butt').on('click',function(){
            $.ajax({
               method: 'GET',
               dataType:'json',
               url:'/blog/test',
               success: function(data){
                  console.log(typeof(data)) // see Object {}
               }
            });
    })
});

BlogController

應該為AJAX請求生成一個JSON響應。

public function test(){
   return response()
        ->json(['type' => 'Test', 'message' => 'It works!']);
}

CSRF保護

這里有很多選擇。 我個人的最愛:

<meta name="csrf-token" content="{{ csrf_token() }}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM