「Laravel」上で自作コントローラが動かない

このQ&Aのポイント
  • さくらレンタルサーバーで「Laravel」を試していますが、自作コントローラが動かない問題が発生しています。
  • さくらサーバーでのみ発生し、他のサーバーでは正常に動作します。
  • routes.phpに直接Hello Worldを表示させると問題は発生しないため、原因は自作コントローラにあると考えています。
回答を見る
  • ベストアンサー

「Laravel」上で自作コントローラが動かない

続けての質問、申し訳ありません。 さくらレンタルサーバーにて「Laravel」を試しています。 「Laravel」を単純にサーバーにアップロードし、「http://○○.sakura.ne.jp/laravel/public/」にアクセスすると、Laravelのトップページにアクセスできるところまで確認しました。 次のステップとして、簡単なコントローラを作成してアクセスしたのですが、エラーになってしまいます。 -- 1.application/controllers に 以下の内容で「hello.php」を作成し、アップしました。 <?php class Hello_Controller extends Base_Controller{ public function action_index(){ echo "Hello World!"; } } 2.application 直下に存在する「routes.php」に以下の内容を追加し、アップしました。 Route::controller(array('hello','index')); -- これで、通常であれば「Hello World!」と画面に表示されるはずなのですが・・・ 添付画像のように404エラーが発生します。 通常、404エラーが表示される場合、Laravelのフレームワークにのっとった?エラー画面が表示されると思うのですが、IEのエラーになります。 また、同時に別サーバーのロリポップでも確認してまして、こちらは正常に「Hello World!」と表示されます。 ちなみに、さくらサーバーにて、routes.phpに直接 Route::get('/',function(){   echo 'Hello World!'; }); と書き込んだ場合は、問題なく表示されることを確認しております。 いったい何が悪いのかが検討もつきません。。 何度も申し訳ありませんが、ご教授、お願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まず、アクセスしようとしているURLに間違いはありませんか? 「http://○○.sakura.ne.jp/laravel/public/hello/」ですよね? 別サーバでは動くのにさくらでは動かないと言うことは、さくらの方でhtaccessの設定が正しく動作していないということも考えられます。 具体的には、apacheサーバの設定でhtaccessからの設定上書き(allow override)が許可されていない、mod_rewriteが有効になっていない、といったパターンです。 このあたりの詳しいことはさくらのサービスマニュアルなどをご覧になった方が良いかと思います。ユーザ数は多いはずなので検索しても情報は見つかるでしょう。 また、本件とはあまり関係なさそうですが、質問者さんはURLに「public」を含む設定にしていますが、本来Laravelはpublicディレクトリをhttpのルートディレクトリに設定し、その上のapplicationディレクトリなどにはアクセスできないようにすることが想定されています(おそらく)。 サーバの仕様で不可能な気がしますが、もし可能であればサーバの公開ディレクトリ設定を変更した方が良いかと思います。 的外れだったらごめんなさい。

nonko0411
質問者

お礼

解決しました! 海外の掲示板を参照し、「.htaccess」の RewriteRule ^(.*)$ index.php/$1 [L] の記述を RewriteRule ^(.*)$ index.php?$1 [L] に変更したら上手くいきました! ありがとうございました。

nonko0411
質問者

補足

ご返答、本当にありがとうございます! 契約しているサーバーは「さくら」の「スタンダード」でして、mod_rewriteは使えるようです。また、.htaccessの利用許可(allow override)もされているようです。 ここに至るまでの流れを記載させてもらいます(まだ大したことはしていないのですが・・・)と、 --- 1.「Laravel」を「/home/(アカウント)/www/」直下に配置しました。 2.とりあえず、「http://○○.sakura.ne.jp/laravel2/public/」にアクセスすると「Internal Server Error」が出る。 3.「/home/(アカウント)/www/laravel/public」直下の「.htaccess」を確認。さくらスタンダードではOptionsが使えないので、この記述を削除 <IfModule mod_rewrite.c> # Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] </IfModule> 「http://○○.sakura.ne.jp/laravel2/public/」にアクセスすると、Laravelのトップページが表示されるようになった。 4.helloコントローラを作成してアクセス(→http://(アカウント).sakura.ne.jp/laravel/hello/)。さくらインターネットでは「Web ページがみつかりません」のエラー。ロリポップではhelloが問題なく動作します。 --- ご指摘のとおり、現在、urlには「public」を含めております。 というのは、実は、実働している別システムが入っているサーバでして、こちらを間借りして確認作業を行っております。勉強不足から、同じサーバ内で動いているシステムに影響を及ぼさない形で公開ディレクトリを変更する方法をまだ良く分かっておらず、とりあえずの方法で進めている状況です。 仕事上、ロリポップよりさくらのレンタルサーバーを利用することが多いので、是非解明したいと思っております。 長々と申し訳ありません。

関連するQ&A

  • さくらのスタンダードでLaravelを動かしたい

    PHPフレームワーク「Laravel」を触ってみたいと思っています。 現在、テスト環境として、さくらレンタルサーバー・スタンダードを契約しています。 「Laravel」をダウンロードして、サーバーにアップしました。 Apacheの設定とか出来ませんので、テスト、と割り切っての動作確認を行おうと思っており、公開ディレクトリの「public」直下に存在する「.htaccess」を外しました。 その状態で、「http://○○.sakura.ne.jp/public/」 にアクセスしてみると HTTP 404エラーとなってしまいます。 ちなみに、上記のやり方で、ロリポップサーバーにアップしたところ、こちらは「Laravel」のトップページが表示されました。 どなたかお分かりになる方、教えて頂けませんでしょうか。 もしかしてさくらレンタルサーバーで「Laravel」は使えないのでしょうか?

    • ベストアンサー
    • PHP
  • LaravelのコントローラーにプロパティはOK?

    お世話になっております。 保守開発でPHPの案件に参画したのですが、既存のソースコードを見たところ、 コントローラーの実装で以下のようなものがありました。 class HogeController extends Controller { private $hoge = null; public function index(Request $request_) { $this->hoge = new stdClass; .... } public function next(Request $request_) { $foo = $this->hoge->foo; .... } .... コントローラーにインスタンス変数(プロパティ)があって、 それに対していろいろと処理をしているのですが、 この実装は問題ないでしょうか? JavaでWebのMVCを開発してきた経験からすると、コントローラーは Singleton である場合が多いのではないかと思うのです。 当案件での実行環境等は、PHP7.2, Laravel5.6 です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ルートが通らない(laravel)

    php artisan route:listコマンドで見るとURIがedit/{id}で確認できるのですが 404エラーが出てNot foundになります。 エラーのurlはlocalhost:8000/%7B%7B%20url('user/edit/'.12)%7D%7Dと なります。 viewとweb.phpとcontrollerの該当箇所は下記の通りです。 (web.phpの部分) Route::post('/edit/{$id}',[KintaiController::class,'edit']) ->middleware('auth:users') ->name('edit'); (viewの部分) echo "<form action=\"{{ url('user/edit/'.$e_time->id)}}\" method=\"POST\">"; echo '<input type="hidden" name="_token" value="' . csrf_token() . '">'; echo "<button type=\"submit\" class=\"btn btn-primary\">更新</button>"; echo "</form>"; echo "</td>"; (controllerの部分) public function edit($id) { $kintaii = Kintai::findOrFail($id); // 取得した値をビュー「user/edit」に渡す return view('user/edit', compact('kintaii')); } index.blade.php内の編集ボタンを押すとuser/edit.blade.phpを呼び出すような仕様にしたいと思っています。 どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • メンバインスタンスへのアクセス方法

    クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。 PHPの文法がまだよくわからないのですが、次のようにやると、エラーになってしまいました。 <?php class Test {  var $member;  public function __construct() {   $member = new Hello();  }  public function test() {   $this->member->world();  } } class Hello {  public function world() {   echo 'hello world';  } } $test = new Test(); // $test->test();はエラーとなってしまう。 $test->test(); ?>

    • ベストアンサー
    • PHP
  • php からlaravelで作り直した場合

    a hrefの書き方がわかりません。 index.phpからa hrefでlast.phpに 先月遷移をさせるソースは下記で動きます。 それをindex.blade.phpからlast.blade.phpに遷移させる ことができません。 一応、web.phpとcontrollerを次のように準備しました。 controllerはDBと繋げているので登録してあるデータを取ってきて last.blade.phpに渡すようにしています。 (index.php)動きます <?php $ym = date("Ym"); $lastmonth = date("Ym",strtotime($ym."01"." -1 month ")); $nextmonth = date("Ym",strtotime($ym."01"." +1 month ")); $tm = date("n",strtotime($ym));//月 $ty = date("Y",strtotime($ym));//年 echo '<a href="last.blade.php?ym='.$lastmonth.'"><< 先月</a>'; echo'<head>'.$ty."年".$tm."月".'</head>'; $this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得 ?> (last.php) 最初の部分だけ記載 $ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym"); 以下からlaravelで作り直しを試みた記載 (index.blade.php)動かないindex.phpのa hrefの部分のみ下記の通り変更 syntax error, unexpected 'user' (T_STRING), expecting ';' or ','エラーが出る。 echo '<a href="{{route('user.local',['ym'=>'$lastmonth'])}}"><< 先月</a>'; (web.php)last部分だけ抜粋 userフォルダの下にlast.blade.php,index.blade.phpがある Route::get('/last', [KintaiController::class,'last']) ->middleware('auth:users') ->name('last'); (controller)KintaiControlerという名前でcontrollerを作ってある一部抜粋   public function last($lastmonth) { // $e_all = Melon::select('price_a','price_b','price_c','price_d')->paginate(3); $e_all = Kintai::all(); return view('user.last',compact('e_all')); } よろしくお願いします。

    • 締切済み
    • PHP
  • Codeigniterの使い方を教えていただけないでしょうか

    はじめまして。Codeigniter初心者です。 「CodeIgniter徹底入門」の書籍を参考にして、 XAMPP+Eclipse環境(Windows Vista、Linux(CentOS)) を構築してみました。 諸設定を行い、EclipseよりPHPプロジェクトを作成し、 Codeigniterをインポートしています。 XAMPPコントロールパネルよりApacheを起動後、 Vista、CentOSよりブラウザで下記のURLにアクセスし、 「CodeIgniterへようこそ!」ページが表示されるところまで 確認できました。 http://localhost/CodeIgniter/ その後、参考書(「コントローラで"Hello World!"を作る」)に 記載されているサンプルコード(下記参照)をそのまま使用して hello.phpを CodeIgniter/system/application/controllers 配下に作成しました。 hello.php --------------------------------------- <?php class Hello extends Controller { function index() { echo 'Hello World!'; } } ?> --------------------------------------- Vista、CentOSのEclipseより Codeigniter/system/application/controllers/hello.php を右クリックして「デバッグ」→「PHP Web ページ(1)」を選択して デバッグを開始しますと下記のエラー(Vistaでのもの)が 発生してしまいます。(Vista、CentOSともに) ------------------------------------------------------------- Fatal error: Class 'Controller' not found in C:\xampp\htdocs\CodeIgniter\system\application\controllers\hello.php on line 2 ------------------------------------------------------------- また参考書には、ブラウザで http://localhost/CodeIgniter/hello のURLにアクセスすると「Hello World!」が表示されると 記載されていましたが、下記のエラーが表示されます。 ---------------------------------------------------------------------- Object not found! 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 Error 404 localhost 04/17/09 20:00:04 Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_autoindex_color PHP/5.2.8 ---------------------------------------------------------------------- フレームワークのControllerがうまく認識できていないようで、 設定上の問題のように思われますが、原因は特定できておらず、 困り果てた挙句、ご質問させていただきました。 お忙しいところ大変恐縮ですが、アドバイスいただければ幸いです。 何卒宜しくお願い申し上げます。

    • 締切済み
    • PHP
  • 関数の第二引数を省略可にする方法

    PHPのソースで <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $s .= ' - '. $strstr; return $s; } echo hogehoge('Hello world','ようこそ!'); // -------------- ?> とすると Hello world - ようこそ! とでますが、 hogehogeの第二引数を省略して <?php // -------------- echo hogehoge('Hello world'); // -------------- ?> hogehogeの第二引数を省略するとエラーが出るので <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $result_strstr = $strstr; // if ( $result_strstr != '' ) ) { $s .= ' - '. $strstr; } if ( isset( $result_strstr ) ) { $s .= ' - '. $strstr; } return $s; } echo hogehoge('Hello world'); // -------------- ?> とやってもエラーが出て 第二引数を省略可という関数を作ることができません。 どのようにすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • Laravelを80で表示するには

    表題の件で質問いたします 環境は以下の通りとなります。 ************************************ [環境] CentOS 7.5 nginx 1.15 php-fpm 7.2.8 Laravel 5.6 80番ポート開放済み SELinuxは停止済み ************************************ デフォルト8000番が確認できてからやったこと ・nginx 80→8000に変更 ・Laravel vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php 8000→80に変更 以下のコマンドを実施 php -S 0.0.0.0:80 public/ 実行結果 PHP 7.2.8 Development Server started at Sun Aug 5 10:37:14 2018 Listening on http://0.0.0.0:80 Document root is /var/www/html/example Press Ctrl-C to quit. ブラウザの結果 このサイトにアクセスできません 160.16.94.174 からの応答時間が長すぎます。 example public を Google で検索してください ERR_CONNECTION_TIMED_OUT 上記の結果まではたどり着きましたが、何かが足りないのかなと 思っております。 解決策をご教示頂けないでしょうか。

  • phpで関数の定義について <?php fun

    phpで関数の定義について <?php function say_hello(){ echo "hello world"."\n"; } say_hello(); echoというのはもともと関数ですよね? 関数を定義するとは、関数を新たに作るということですよね? この新たに作った、say_hello();という関数の中に echo "hello world"."\n";という関数を入れてあるということですか?

    • ベストアンサー
    • PHP
  • PHPを勉強中なのですが一点わからない部分が

    現在PHPを勉強中なのですがちょっと分からない部分がありまして質問します。 例題1は引数を指定してもしなくても実行すればHello Worldと表示されます。 しかし例題2は引数($var)を指定しないとエラーとなります。 この違いはなんでしょうか?私には同じに見えますが・・。 例題1 <?php function somefunc(){ print ( "Hello World" ); }; somefunc(); ?> 例題2 <?php function my_print_r( $var ){ echo "<pre>"; print_r( $var ); / echo "</pre>"; }; $name = array("sophy","nancy","angera"); my_print_r($name); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう