ルートが404を返していますが、どうすれば修正できますか?


82

Laravelフレームワークの学習を始めたばかりですが、ルーティングに問題があります。

動作している唯一のルートは、箱から出してLaravelに接続されているデフォルトのホームルートです。

私はWindowsでWAMPを使用しており、PHP5.4.3とApache2.2.22を使用しています。また、mod_rewriteを有効にし、application.php構成ファイルから「index.php」を削除して空の文字列を残しています。

Userという新しいコントローラーを作成しました:

class User_Controller extends Base_Controller {

    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

application / views / user /にindex.phpという名前のビューファイルをいくつかの基本的なHTMLコードで作成し、routes.phpに以下を追加しました。

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

最初のルートhttp://localhost/mysite/publicは、Webブラウザでルート()にアクセスすると正常に機能しますが、2番目のルートに移動しようとするとhttp://localhost/mysite/public/user、404 NotFoundエラーが発生します。なぜこれが起こっているのでしょうか?


.htaccessは、そのままの状態で変更されていません。
JasonMortonNZ 2012

WAMPが問題だったようです。XAMPPに変更され、すべてが正常に機能します。WAMPが問題であったことを説明するこの質問に自己回答する必要がありますか?
JasonMortonNZ 2012

@AquilaSolutionsはい、できます。したがって、誰もがあなたの問題が今解決されていることをはっきりと見るでしょう。
Jocelyn 2012

回答:


25

代わりにこれをルートファイルに追加してみましたRoute::get('user', "user@index")か?

前にテキストの一部が@userこの場合には、ユーザーのコントローラと後のテキストの一部にページを指示する@indexにスクリプトを指示するuser機能public function get_index()

使用しているようです $restfulあなたが設定することができ、その場合には、RouteにをRoute::any('user', 'user@index')。これは、両方を別々に書き出すのではなく、POSTとの両方を処理GETします。


問題が残っているため、WAMPからXAMPPに変更します。XAMPPサーバーで新しいプロジェクトを開始し、「。」の代わりに「@」記号を使用した後。今はうまく機能しています。
JasonMortonNZ 2012

1
WAMPで正常に動作します。rewrite_moduleを有効にする必要があります。以下の@Muveraのコメントを参照してください。
ajon 2015年

3
これは古い答えですが、同様の問題がありました。新しいルートが追加され、機能しませんでした。(404)。キャッシュされたルートをクリアするだけで済みました!php artisan route:clear
trainoasis 2015

119

Ubuntu LAMPのインストールで、次の2つの変更を加えてこの問題を解決しました。

  1. Apacheサーバーでmod_rewriteを有効にします。 sudo a2enmod rewrite
  2. /etc/apache2/apache2.confを編集し、/ var / wwwディレクトリ(私のメインドキュメントルート)の「AllowOverride」ディレクティブを変更します。AllowOverride All

次に、Apacheサーバーを再起動します。 service apache2 restart


これにより、puphpetからダウンロードしたvagrantマシンでこの問題が修正されました。
winkbrace 2015

5
ありがとう、あなたは命の恩人です。
ハッサンムルタザ2015年

3
どうも

Laravel-5.4を搭載したMacOSHigh Sierra 10.13.3で私のために働いた
Yevgeniy Afanasyev

2
@McSonk、おそらく質問はWindows用です。この代替ソリューションはUbuntuで機能します。おいありがとう。
フェンディセプティアワン

63

WAMPを使用して、wampアイコン-> apache-> apache modules->スクロールし、rewrite_moduleを確認します。LoadModuleを再起動します。rewrite_module

「rewrite_module」を有効にすると、サーバーアプリケーションが自動的に再起動することに注意してください。


たくさんありがとう、昨日からこの問題を分類しようとしていました
Moe

2
これは、コンピューターにWAMPとLaravelをインストール/再インストールするたびに発生するようです。これは常に問題です。うまくいけば、それは最終的にメモリにコミットされます;)
ケンモア

Ubuntu 14.04では、「sudo a2enmod rewrite」、次に「sudo serviceapache2restart」が機能していました。
nspo 2014

Linuxシステムの場合sudo a2enmod rewrite、再起動後 に書き換えモジュールを有効にしますsudo service apache2 restart
aimme 2016

35

確認してみましたか

http://localhost/mysite/public/index.php/user 

仕事をしていました?その場合は、すべてのパスのフォルダーに大文字が含まれていないことを確認してください。私も同じ状況で、文字を小文字に変換するのに役立ちました。


ありがとう。Laravelの本(Laravel Starter)を段階的に読んでいて、クロージャーへのルーティング(13ページ)で立ち往生しています。これは私にとってその問題を解決しました。
スティーブリンジー2013

これで私の問題は解決しました。apacheフォルダーのルートに.htaccessがあり、laravelのhtaccessが壊れていました。
maarten00 2013

これは私が持っていた他の問題を解決しました。Laravelを使用してページを生成し、Angularを使用してRESTを呼び出すと、Windowsでは呼び出しがapi/branches機能しましたが、Linuxでは次のようにこのURLを変更する必要がありました:index.php/api/branchesこれを解決して同じURLにする方法はありますか?
miroslavign 2015

大文字と小文字が区別されるとは思っていませんでした
ClearBoth 2017年

代わりに、public /フォルダーからプロジェクトのルートに.htaccessファイルを配置すると、次の方法でアクセスできます。 http://localhost/mysite/user
Rohan Khude 2018年

9

EasyPHPを使用しても同じ問題が発生していました。のブロックで指定する必要AllowOverride Allがあることがわかりまし<Directory>httpd.conf。これがないと、Apacheはあなたのを無視することがあります.htaccess

私のはこのようになってしまいました...

<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>

Debian GNU / Linux 7.6で、この応答は、apache2(a2enmod rewrite)のモジュールを有効にすることに加えて、必要なものの一部を提供することがわかりました。
Kevin Buchs 2014

6

あなたが移動しようとすることができますroot/public/.htaccessroot/.htaccess、それが動作するはずです


4
あなたは8つの質問にまったく同じ答えを投稿しました。それらが重複していると思われる場合は、そのようにマークし、それぞれに回答を投稿しないでください。
Jaap 2016

5

ルート

それらを使用して、コントローラーによって管理されない特定のルートを定義します。

コントローラー

従来のMVCアーキテクチャを使用する場合に使用します

あなたの問題の解決策

コントローラアクションに特定の「名前付き」ルートが必要でない限り、コントローラをルートとして登録しません。

コントローラーアクションのルートを作成するのではなく、コントローラーを登録するだけです。

Route::controller('user');

今すぐあなたのコントローラが登録されている、あなたがにナビゲートすることができますhttp://localhost/mysite/public/userし、あなたがget_index実行されます。

すべてのコントローラーを一度に登録することもできます。

Route::controller(Controller::detect());

3

あなたの「RewriteBase」を忘れないでくださいpublic/.htaccess

例えば ​​:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

これをファイルのどこに置きますか?
ゴダード

3

OK、それで、この問題に1日ちょっと頭をぶつけた後、私は起きて、昨日やるべきことをやった、そして何が起こっているのかをデバッグした!

Laravelがここでやろうとしているのはindex.php、ルートとして指定されたパスの直前にファイルを挿入することです。たとえば、を指定してブラウザでRoute::get('/account/create', ...,アプリlocalhost/laravel/authenticate/public/account/createを実行するとlocalhost/authenticate/public/index.php/account/create、laravelは実行したいのですが、それを実行する必要があります。Apacheはそのリクエストを確認する必要/wamp/www/laravel/laravel/authentication/publicがあります(パスは場所によって多少異なる場合があります) laravelアプリは実際にインストールされていますが、末尾はpublicは置換を行う必要がある場所です)「RewriteRule」を適用する必要があります。

ありがたいことに、laravelは.htaccessアプリのpublicフォルダーにある便利なファイルで正しい書き換えルールを提供します。問題は、その「.htaccess」ファイルのコードが、WAMPをそのまま設定する方法では機能しないことです。このSEEMSが、このスレッドの先頭にあるmuveraによって提案された問題である理由-rewrite_moduleコードは、機能する前にApacheによってロードされる必要がありますRewriteRule。これは理にかなっています。

意味をなさない部分:単純にstoppingrestartingApacheサービスはWAMPがRewriteRuleで正しいことを行うために必要な変更を取得しません-私はこれを何度も試しました!

何が機能するか:正しいモジュールをロードするために、muvera(スレッドの上部を参照)によって提案された変更を加えます。次に、Windowsセッション全体をリセットして、Apacheをメモリから完全にダンプします。WAMPを再起動(リロード)して、VOILA!修正が機能し、正しいRewriteRuleが適用されます、yada、yada; 私はその後ずっと幸せに暮らしています。

このすべてのアウト良いニュース:私はもっとについて多くのことを知っている.htaccessRewriteRulehttpd.conf今ファイル。アプリのpublic .htaccessファイルからロジックを移動し、それをDirectory ...Apacheの「bin」フォルダーBTWのhttpd.confのセクションに配置することには、優れた(パフォーマンス)引数があります(特にそのフォルダーにアクセスできる場合)。


0

php.iniで短いphpタグを有効にしてみてください。WAMPは通常それらをオフにし、laravelはそれらをオンにする必要があります。


待って、何?Laravelには短いタグが必要ですか?
ビショップ

0
Route::get('/', function()
{
return View::make('home.index');
});

Route::get('user', function()
{
return View::make('user.index');
});

上記をに変更

Route::get('user', function()
{
return View::make('user.index');
});

Route::get('/', function()
{
return View::make('home.index');
});

ルートの最後に「/」(ホーム/デフォルト)を使用する必要があります


0

Laravel5コマンドを使用している必要があります

  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

そしてroutes.phpで

  Route::get('/', function()
  {
  return view('home.index');
  });

  Route::get('user', function()
  {
  return view('user.index');
  });

ビューとコントローラーのLaravel5コマンドの変更は、以前に同じエラーが発生していたドキュメントを参照してください



0

laravelパブリックフォルダー内のデフォルトの.htaccessファイルを削除したと思います。ファイルをアップロードすると、問題が解決するはずです。



0

Homesteadを介してVagrantを使用している場合は、共有フォルダーのマウント中にエラーが発生した可能性があります。Vagrantはそのフォルダーからファイルを取得し、起動時に実際にホストマシン上にあるファイルをスワップアウトするようです。したがって、エラーが発生した場合は、基本的に、最初に作成したときからLaravelインストールにアクセスしようとしています(これが、インストール中に生成された「ホーム」のみを取得する理由です)。

これは、仮想マシンにsshingし、routes / web.phpファイルをチェックして、実際にファイルであるかどうかを確認することで簡単に確認できます。そうでない場合は、アウト終了してvagrant haltvagrant up、および起動時にエラーを探します。


0
  1. セットアップ.envファイル
  2. 構成、設定 index.html
  3. あなたが持っていることを確認してください .htaccess
  4. sudo service apache2 restart

おそらくそれはキャッシュの問題が原因です


0

ルートが機能しない主な問題は、macosにmod_rewrite.soモジュールがあり、apache構成のhttpd.confファイルでlinuxが有効になっていないため、.htaccessが機能することです。私は行のコメントを外すことによってこれを解決しました:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

#上の行からを削除しhttpdf.confます。その後、それは動作します。
楽しい!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.