物事を明確にするためにこの編集を行っています。詳細情報が必要な場合は、編集の下の内容をお読みください。
基本的に、laravel cms をサイトのサブディレクトリにデプロイして、通常の laravel の「パブリック」フォルダーが example.com/blog になるようにしました
ルート、つまりexample.comにデプロイするとアプリは正常に動作しますが、サブディレクトリ/サブフォルダーにデプロイすると機能しません(以下のパスなどを参照)。ブログ記事はメインの /blog インデックス ページに問題なく表示されているため、パスの問題ではないようです (ただし、間違っている可能性があります)。
問題:認証が失敗しているため、cms のバックエンドにログインできません。
ログインコントローラーに変更を加えて、これをテストしました。
public function user()
{
$username = Input::get('username');
$password = Input::get('password');
if(Auth::attempt(array('username' => $username, 'password' => $password)))
{
// we are now logged in go here
return Redirect::to('test');
}
else
{
return Redirect::to('wrongdetails');
}
}
そして私のルート:
Route::get('test', function()
{
if (Auth::check())
{
return 'the user is logged in';
}else
{
return 'the user is not logged in';
}
});
Route::get('wrongdetails', function()
{
return 'wrong password';
});
結果: ログインフォームに正しい詳細を送信すると、/test に誘導され、ユーザーがログインしていないことが通知され、間違った詳細を送信すると、間違った詳細ページに移動します。何か案は?
カスタム cms を作成しました。バックエンドへのログインは、'public' フォルダがドメインのルート、つまり共有ホストの public_html にある場合に完全に機能します。
しかし、最近のプロジェクトでは、ルートの「public」フォルダーとしてサブフォルダー「/blog」を使用する必要があり、適切に認証されていません。
余談ですが、アプリケーションは次のように機能します。
www.example.com/blog/secure/login でログインすると、example.com/blog/cms のバックエンドに移動します
example.com/blog/cms は、認証されている場合にのみアクセスできます。認証されていない場合は、filter.php 経由でログイン ページにリダイレクトされます。
私の route.php の関連部分は次のようになります。
Route::group(array('before' => 'auth'), function()
{
Route::resource('cms', 'PostsController');
});
Route::get('secure/login', function()
{
return View::make('secure/loginForm');
});
Route::post('secure/login', 'UserLogin@user');
私の loginForm ビューは、関連して次のようになります。
<?php echo Form::open(array('url' => '/secure/login', 'class' => 'box login')); ?>
<fieldset class="boxBody">
<label>Username</label>
<input type="text" tabindex="1" name="username" required>
<label>Password</label>
<input type="password" name="password" tabindex="2" required>
<input type="submit" class="btnLogin" value="Login" tabindex="4">
</fieldset>
</form>
最後に、コントローラーは次のようになります。
public function user()
{
// get POST data
$userdata = array(
'username' => Input::get('username'),
'password' => Input::get('password')
);
if(Auth::attempt($userdata))
{
// we are now logged in, go to admin
return Redirect::to('/cms');
}
else
{
return Redirect::to('secure/login');
}
}
コントローラーのifステートメントを渡して/ cmsに移動するという意味で機能しますが、/ cmsに到達すると、認証済みとして表示されないため、ログインページにリダイレクトされます。
認証が引き継がれない理由を誰でも見ることができますか? 前述したように、パブリック フォルダーがドメインのルートであり、サブフォルダーにない場合に機能します。
これが役立つ場合があります。filters.php の関連部分は次のようになります。
Route::filter('auth', function()
{
if (Auth::guest())
return Redirect::to('secure/login');
});
フィルターを Redirect::to(' http://google.com ');に変更すると、コントローラーで「if」ステートメントを渡していることがわかります。Google にリダイレクトされます。ログインが機能してから /cms に渡されることを意味しますが、/cms ディレクトリは認証されていないものとして私をピックアップし、それが理にかなっている場合は Google.com に送信します。
cms がサブドメインを指すようにパスが変更されました。bootstrap/paths.php の関連部分は次のとおりです。
'app' => __DIR__.'/../../mycms/app',
'public' => __DIR__,
'base' => __DIR__.'/../../mycms',
'storage' => __DIR__.'/../../mycms/app/storage',
また、/blog サブディレクトリにある index.php:
require __DIR__.'/../../mycms/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../mycms/bootstrap/start.php';
これは絶対に頭を悩ませています、ハ。