お名前.comのレンタルサーバー「SDサーバー」にローカル環境で作成したLaravelのプロジェクトをアップデートしてみました。
DBの設定を本番環境用に変更して、トップページを確認してみたら表示されました。
「ファイルをそのままアップしても動くんだなぁ」と、この時、安心してました…。
しかし、トップページ以外を確認してみると「404 Not Found」の文字が。
トップページ以外が「404 Not Found」になる問題にぶち当たり、さらに1日かけても解決せず。
家に帰って落ち着いて考えて別のアプローチをリサーチして、次の日に試してみると1発で通りました!
次の日になったらあっさり解決。プログラマーあるあるですね!
お名前.comの「SDサーバー」は古いので、あまり需要はなさそうですが備忘録にまとめてみました。
今回、「https://www.●●●.net/laravel-test/public」にアクセスするとトップページが表示されるテイで解説していきます。
前提条件:SDサーバーにComposerをインストールできない!!
ネットで調べていると、『レンタルサーバーに「Composer」をインストールして、Laravelをインストールする』ように手順を紹介していページがほとんどでした。
しかし、お名前.comの「SDサーバー」は「Composer」をインストールできません。
最初から詰んでますね……
そのため、ローカル環境で開発したブログラムをそのままサーバーにアップする方法を取りました。
ただここでまたも問題が。
Laravelのファイル数はとんでもない量で、FTPでアップロードするととんでもなく時間はかかるし、アップロードに失敗しているファイルが隠れている可能性もあります。
というわけで、まずはローカル環境のプロジェクトをアップデートするところから手順を紹介します。
手順1.開発したファイルをすべてアップする
まずはローカル環境で開発したファイルを丸ごとアップロードします。
しかし、先ほどにも触れた通り、Laravelのファイル数はとんでもない量です。
FTPでアップすると失敗しているファイルが隠されている可能性もあるのであまり推奨できません。
あと、とんでもなく時間がかかります……。
途中で辞めましたが、それでも1時間以上はかかってました。
なので今回はLaravelプロジェクトをすべてzipファイルにして、サーバー上で公開するような手順にしてみました。
方法は簡単です。
たとえばLaravelプロジェクトのファイル名「laravel-test」を圧縮して、「laravel-test.zip」ファイルを作成しておきます。
そのzipファイルをFTPでアップロードしておいてください。
次に以下のPHPファイルを作成します。
<?php
$zip = new ZipArchive;
if ($zip->open('laravel-test.zip') === TRUE) {
$zip->extractTo('/');
$zip->close();
echo '解凍成功';
} else {
echo '解凍失敗';
}
?>
アクセスしたら、zipファイルを解凍するソースです。
あなた用に変更する箇所は2点です。
5行目の「zipファイル名」と、6行目の「zipファイルの解凍先」です。
このPHPファイルもzipファイルと同じ場所に、FTPでアップしてください。
そしてブラウザで「https://www.●●●.net/unzip.php」にアクセスして、「解凍成功」の文字が表示されたら成功です!
私の場合、5秒~10秒程度で終わりました!
普通にFTPでアップするよりも圧倒的に速く終わります。
PHPファイルやzipファイルを置いた場所に、「laravel-test」フォルダが生成されているのも確認しておきましょう!
「解凍失敗」の文字が表示された場合は、zipファイル名や解凍先に誤りがないか確認してくださいね。
手順2.「.env」のDBの設定を変更する
Laravelプロジェクト直下の「.env」のDBを本番環境用に変更します。
DB_CONNECTION=mysql
DB_HOST=ホスト名
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
ここら辺の情報は、お名前.comのコントロールパネルで確認できます。
手順3.「config/app.php」を変更する
次に「config/app.php」ファイルの以下の箇所を変更します。
'url' => env('APP_URL', 'https://www.●●●.net/laravel-test'),
「url」で検索して、変更しておきましょう!
これで普通なら動くはずなのですが……
問題:トップページ以外が「404 Not Found」になってしまう
トップページである「https://www.●●●.net/laravel-test/public」にアクセスすると、問題なく表示されるんです。
安心したところで、別ページをアクセスしてみると「404 Not Found」。
え?トップページは問題ないのに??と戸惑いました。
トップページでDBに登録したデータを取得できるか試してみたら、ちゃんと動いたのでDBの設定に失敗しているわけでも、Laravelが動かないわけでもない。
リサーチしてみたら、「SSHに繋げてシンボリックリンクを貼る」とか「.htaccessの設定を変える」とかありました。(方法は以下に記述していきます)
それらを試してみると「Internal Server Error(500エラー)」に変身。
ここで半日以上悩みました……
しかし、「.htaccess」をちゃんと変更すると解決しました!
これらの問題を解決する方法を、次に紹介していきます。
手順4.公開ディレクトリに「public」のシンボリックリンクを作成する
ここでは「Tera Term」を使います。
「Tera Term」を使ったことがない人でも、簡単なコマンドしか使わないので安心してください!
「Tera Term」のインストールや、接続方法は公式サイトに説明があるので参考にしてください。
接続が完了したら、まずはシンボリックリンクを作成する場所に移動します。
cd ●●●.net
「cd」はフォルダ移動のコマンドです。
次に「●●●.net」に移動できたのか確認のため、現在の場所にあるファイル一覧を表示してみます。
ls -l
Laravelプロジェクトのフォルダ名も確認できたでしょうか?
私の場合は「laravel-test」があることを確認しました。
ここで、以下のコマンドを使用してシンボリックリンクを作成していきます。
ln -s ~/●●●.net/laravel-test/public/* ~/●●●.net/
Laravelプロジェクトのフォルダ名やURLは適時変更してくださいね。
これで「public」フォルダのシンボリックリンクを作成できるのですが、実はこれだけでは「.htaccess」のシンボリックリンクが足りません。
次のコマンドも実行してください。
ln -s ~/●●●.net/laravel-test/public/.htaccess ~/●●●.net/
さて、これでシンボリックリンクを作成できたのですが、念のため確認をするために以下のコマンドを実行します。
ls -l
シンボリックリンクを作成する前と比べると、ファイルが増えているのが分かります。
「public」内と同じファイルやフォルダ(たとえばfavicon.ico、robots.txt、jsなど)が増えていたら成功です!
ファイル名やフォルダ名の横に、参照先の記述もあるので合わせて確認しておきましょう。
これで、「404 Not Found」は消えます。
でも、次は「Internal Server Error(500エラー)」になってしまうんです!
引き続き、解決策を紹介します!
手順5.「public/.htaccess」を編集する
「public/.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>
これを、以下のように変更します。
<IfModule mod_rewrite.c>
#<IfModule mod_negotiation.c>
# Options -MultiViews -Indexes
#</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase "/laravel-test/public/"
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^laravel-test/public/(.*) %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
12行目と17行目はフォルダ名を修正してコピペしてください。
これで、トップページ以外を確認してみると、しっかり表示されるようになりました!
「.htaccess」の設定にすごく苦戦しましたが、すっくり解決です!
さいごに
お名前.comレンタルサーバーのSDサーバーを使い、かつ、Laravelを使うパターンは少なそうですが、解決した方法をまとめてみました。
1日悩んで解決してスッキリです。
他のサーバーだとまた違う解決方法があるみたいなので、参考程度にやってみてくださいね。
最後までお読みいただきありがとうございました!