Laravel 5 – URLからパブリックを削除


240

これは非常に人気のある質問ですが、Laravel 5の実用的な解決策を見つけることができませんでした。私は長い間、Codeigniterからの移行を試みてきましたが、この複雑なインストールプロセスは、私を先延ばしにし続けます。

VMを実行したくありません。これは、プロジェクトを切り替えるときにぎこちないと思われます。

ドキュメントルートをパブリックフォルダに設定したくありません。これは、プロジェクトを切り替えるときにも厄介です。

.htaccess mod_rewriteメソッドを試しました

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

これにより、compiled.php行7610にLaravel NotFoundHttpExceptionが表示されます。

先ほどL4を試してみたところ、パブリックフォルダーの内容をルートに移動する方法を使いました。L5の構造はまったく異なり、同じ手順を実行すると、Laravelが完全に壊れました(サーバーは空白のページのみを返します)。

次のような開発環境で「パブリック」を削除する適切な方法はありますか?

  1. L5で動作
  2. プロジェクトを簡単に切り替えることができます(私は通常、いつでも2または3で作業しています)。

ありがとう

** MAMPとPHP 5.6.2を使用しています


1
ガイドのフォルダ構造は私のものとは異なりますが、L5を使用していないと思いますか?Bootstrap / Pathsファイルが存在しないため、彼が行った変更は省略しました。プロジェクトは機能しているようです。これは大丈夫だと思いますか?
user1537360 2015

私の間違いでL5の回答を追加させてください
kamlesh.bar

同じことを試みても成功しない
kamlesh.bar

1
index.phpファイルのパスを変更するだけで機能するように見えますが、Laravelは初めてなので、これが安定しているか安全であるかについてはコメントできません。
user1537360 2015

他のフォルダ/ファイルは、ドキュメントルートの下にあるはずです。
MikeRockétt、2015

回答:


430

Laravel 5の場合:

  1. server.phpLaravelルートフォルダの名前をindex.php
  2. ディレクトリからLaravelルートフォルダに.htaccessファイルをコピーし/publicます。

それでおしまい!


104
これは安全ではない可能性があるため.env、データベースパスワードをクリアテキストで表示する人に問題がない限り、これを行う場合は誰もファイルをリクエストできないようにしてください;)
GabLeRoux

48
ルートieからの相対パスを使用してアセットを参照している場合、これは機能しません。「/assets/styles.css」など。サーバー上に展開する最善の方法を見つけるのにまだ苦労しています
Ghazanfar Mir 2015

1
これは機能します...しかし、これを使用することで何らかの結果/欠点がありますか?多くの人が仮想ホストの設定やファイルの手動コピーなどを提案しています...これは本番環境でも機能しますか?
Bogz、2015年

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>は、対処した問題を解決します。今は安全ですか、それ以上のリスクがありますか?
バタフライ

1
@Butterflyitはサーバーの設定に依存します。上記はブロックするだけですlog.txt。公開されている機密データは必ずブロックしてください。Laravelを使用してドキュメントを注意深く読むと、Webルートは次のようになりますproject/public。見ていこのstackoverflowのディスカッション・QAを。ウェブサーバーをセットアップして、念のため試してくださいhttps://example.com/.env。パスワードが表示された場合は、すべてが危険にさらされていることを考慮して、すべてのパスワードを変更してください。
GabLeRoux 2018

126

私は2つの答えを使用して問題を解決しました:

  1. server.phpの名前をindex.phpに変更(変更なし)
  2. .htaccessをパブリックフォルダーからルートフォルダーにコピーします(rimon.ekjonが以下で言うように)
  3. 静的の場合、次のように.htaccessを少し変更します。

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

    他に必要な静的ファイルがある場合は、前に宣言したリストに拡張子を追加するだけです


1
こんにちは@KA_lin。localhost / oap / .envの
Fokwa Best

8
RewriteRule ^.env - [F,L,NC]
うーん

2
または <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin

@ka_linに感謝します。/public/からアクセスを削除する方法はありますか?www.yoursite.comは機能しますが、www.yoursite.com / publicも機能します。最後のものは削除できますか?
アダバ

8
動作していますが、css、js、画像が読み込まれていません
Chetan Khandla 2017年

93

Laravel 5.5では、ルートディレクトリに.htacessファイルを作成し、次のコードを配置します:- 参照リンク

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

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>

5
ベストアンサー!私の例では1つだけが機能しました。間違いなく賛成票が
増えるはずです。– FiliusBonacci

ありがとう、これは私にとって仕事です。しかし、セキュリティ上の問題があるかどうかを知りたいです。
rahul singh Chauhan

@rahulsinghChauhanどうぞよろしくお願いします。セキュリティの問題についてはわかりませんが、セキュリティで保護されている必要があります。
ラハム

2
このルールは何をしRewriteRule ^ ^$1 [Nますか?
gonzo

これは私のために働いた唯一のものです...どうもありがとう
Arshad Ameen

84

しないでください!

あなたが本当にすべきではない名前の変更server.phpにごLaravelのルートフォルダにindex.php してコピー.htaccessからファイルを/publicごLaravelのルートフォルダにディレクトリ!!!

このようにして、すべてのユーザーが一部のファイルにアクセスできます(.envたとえば)。自分で試してみてください。あなたはそれを望まない!


行う

代わりに、次の.htaccessようにルートにファイルを作成する必要があります。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

これにより、すべてのベースURIが/publicフォルダーにサイレントに書き換えられます。すべてのヘッダー、たとえばHTTP Authorization Header、およびすべてのオプションのURIパラメーターでさえ、警告なし/publicフォルダーに渡されます。

それで全部です

DockerでLaravelプロジェクトを設定するときは注意してください。これを行う必要はありません。


2
本番環境では問題なく機能していますが、ローカルでは機能していません。
Haritsinh Gohil

2
これは完全に機能しています!ローカルとサーバーはセキュリティの助けに感謝します!
Ghanshyam Nakiya

1
こんにちは、@ DerkJanSpeelman私のホスティングのサブフォルダー内に(例.com / projects / laravel / blog)のようにlaravelファイルをアップロードしようとしています。パブリック、コードを含む.htaccessファイルをブログフォルダーのルートに置き、パブリックフォルダーにリダイレクトするようにします。しかし、それは機能していません。発生したエラーは次のとおりです:要求されたURL / public /がこのサーバーで見つかりませんでした。どうすればこれを解決できますか?
Shovon Das

1
この答えは過小評価されています。太字に賛成して強調表示します。まったく問題なく動作しています。
Varun Ved、

2
完璧な答え
alnassre

43

laravel 5 urlからpublicを削除する簡単な方法。パブリックディレクトリからindex.phpと.htaccessを切り取り、それをルートディレクトリに貼り付けるだけで、index.phpの2行を次のように置き換えるだけです。

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

:上記の方法は、仮想ホストの設定で問題が発生する可能性があるため、初心者向けです。最善の解決策は、ローカルマシンで仮想ホストを設定し、プロジェクトのパブリックディレクトリを指すようにすることです。


1
そのcssが読み込まれないと、bcozすべてのcssが公開され、公開がURLから削除されます
Mr. Tomar

1
ロード中にjsまたはcssファイルの前に "public /"を置くことができます。例:Html :: script( "public / js / ....."); -しかし、最善の解決策は仮想ホストです...
Muhammad Sadiq

39

@ rimon.ekjonさんのコメント:

Laravelルートフォルダーのserver.phpの名前をindex.phpに変更し、.htaccessファイルを/ publicディレクトリからLaravelルートフォルダーにコピーします。 - それでおしまい !!:)

それは私のために働いています。しかし、/ publicディレクトリ内のすべてのリソースファイルを見つけることができず、URLをリクエストできませんでした。これは、asset()ヘルパーを使用したためです。

/Illuminate/Foundation/helpers.php/asset()関数を次のように変更しました:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

今すべてが動作します:)

@ rimon.ekjonと皆さんに感謝します。


3
これは、この問題を解決するための良い方法ではありません。ベンダーディレクトリで更新しようとしているため、これは適切な方法ではありません。
Shadman、2018年

1
RewriteRule ^(.*)$ public/$1 [L]この行を削除して、パブリックディレクトリからコピーした.htaccessファイルに追加するだけです RewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

ルートに.htaccessファイルを作成し、これらの行を追加するだけです

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

それでおしまい!

上記のコードはルートpublic_htmlフォルダーで機能します。ディレクトリがpublic_html / laravelapp / publicのように見え、上記のコードをlaravelapp内に置いた場合、コアlaravelファイルはpublic_htmlフォルダー内にあるはずだと述べましたが、機能しません。したがって、すべてのコアファイルをpublic_htmlにコピーし、.htaccessファイルをそこに配置する必要があります。

コードをサブディレクトリに保持したい場合は、サブドメインを作成できます。このコードはそのためにも機能します。


私はあなたの答えを読む前に以下に答えました、そしてこれは受け入れられた答えでなければなりません。ファイルの変更はありません。単純で巧妙なルールです。
ブリゴ2018年

@Raham現在のURLは?
Abhinav Saraswat、2018

2
この紳士の作品の上に短い説明を追加したいだけです。上記のコードはルートのpublic_htmlフォルダーで機能します(私にも問題がありました)。コアのlaravelファイルはpublic_htmlフォルダー内にあるべきだと言っていましたが、上記のコードをlaravelapp内に配置すると機能しませんが、私のディレクトリーがpublic_html / laravelapp / publicのように見えるという誤りを犯しました。したがって、すべてのコアファイルをpublic_htmlにコピーし、.htaccessファイルをそこに配置する必要があります。laravelのcentOSおよびCpanelホスティングを参照。
Deepesh Thapa

この方法の欠点は何ですか?
Script47 '10 / 10/18

1
私にとっては魅力のように機能しました。私はcPanel webshostしか持っておらず、ApacheのRootDirectoryを変更できませんでした。よろしくお願いします!最も簡単で安全です。これにより、ルートフォルダーの内容を表示できなくなります
Vincent Decaux

27

ルートディレクトリに.htaccessファイルを作成し、以下のようなコードを配置します。

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

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

1
私は本当にこのソリューションをお勧めします。
TheLastCodeBender

1
私もこのソリューションをお勧めします
iglesiased

どうもありがとうございます。これは完璧です(y)
Prappo Islam Prince

3
それは正常に動作していますが、URLから直接アクセスできる.envファイルです。
Manoj Singh

安全なソリューションですか?
シニアPHPプログラマチームリーダー

23

1)L5でパブリックディレクトリを移動するための有効な方法が見つかりません。ブートストラップの一部を変更できますがindex.phpかのヘルパー関数は、そのパブリックディレクトリが存在することを前提にしています。正直なところ、パブリックディレクトリを移動するべきではありません。

2)MAMPを使用している場合は、プロジェクトごとに新しい仮想ホストを作成する必要があります。作成したら、次のように定義したサーバー名で各プロジェクトにアクセスします。

http://project1.dev
http://project2.dev

15

laravel5でパブリック URL を削除することが可能です。次の手順を実行します:

手順1. publicからすべてのファイルをコピーし、ルートディレクトリに貼り付けます

ステップ2. index.phpファイルを置き換える

 require __DIR__.'/../bootstrap/autoload.php';

 require __DIR__.'/bootstrap/autoload.php';

そして

$app = require_once __DIR__.'/../bootstrap/app.php';

$app = require_once __DIR__.'/bootstrap/app.php';

そして、すべてのキャッシュとCookieを削除します。


こんにちは、私はあなたの方法を試し、上記の手順を実行しましたが、次のエラーが表示されます:警告:require_once(D:\ Projects \ laravel / public / index.php):ストリームを開けませんでした:Dにそのようなファイルまたはディレクトリはありません: 21行目の\ Projects \ laravel \ server.php致命的エラー:require_once():必要な 'D:\ Projects \ laravel / public / index.php'を開くことに失敗しました(include_path = '.; C:\ xampp \ php \ PEAR' )21行目のD:\ Projects \ laravel \ server.php内
Ali Shahzad

これは完全な答えではなく、はるかに安全でない方法です。
Rohit

11

他のすべてのファイルとディレクトリを「locale」という名前のフォルダーに配置したとします。

ここに画像の説明を入力してください

index.phpに移動して、次の2行を見つけてください。

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

これを次のように変更します。

require __DIR__.'/locale/bootstrap/autoload.php';

$app = require_once __DIR__.'/locale/bootstrap/app.php';

11

2018年5月現在、Laravel 5.5で機能する最善かつ最短のソリューションは次のとおりです

  1. .htaccessファイルを/ publicディレクトリからルートディレクトリに切り取り、その内容を次のコードに置き換えます。

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
           Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ /$1 [L,R=301]
    
        RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ server.php [L]
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_URI} !^/public/
        RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
    </IfModule>
  2. .htaccessファイルを保存するだけです。

  3. server.phpファイルの名前をに変更します index.php。それはすべてお楽しみです!


9

最善のアプローチ: 代わりにon local computer create a virtual host point to public directoryとを削除することをおすすめしませんon remote hosting change public to public_html and point your domain to this directory。理由は、その1レベル下のパブリックディレクトリなので、laravelコード全体が安全になります。

方法1:

名前server.phpを変更するだけindex.phpで機能します

方法2:

これはすべてのlaravelバージョンでうまく機能します...

これが私のディレクトリ構造です。

/laravel/
... app
... bootstrap
... public
... etc

次の簡単な手順に従ってください

  1. すべてのファイルをパブリックディレクトリからルート/ laravel /に移動します
  2. 今、公開ディレクトリは必要ないので、オプションで今すぐ削除できます
  3. 今度はindex.phpを開き、以下の置き換えを行います

DIRが必要です。 '/ .. / bootstrap / autoload.php';

DIRが必要です。 '/ bootstrap / autoload.php';

そして

$ app = require_once DIR。 '/ .. / bootstrap / start.php';

$ app = require_once DIR。 '/ bootstrap / start.php';

  1. ここでbootstrap / paths.phpを開き、パブリックディレクトリパスを変更します。

'public' => DIR。 '/ .. / public'、

'public' => DIR。 '/ ..'、

それだけです、今すぐhttp:// localhost / laravel /を試してください


すべてに問題ありません。しかし、artisanコマンドは機能せず、「入力ファイルを開けませんでした:artisan」と表示されるだけです。何か提案はありますか?
Kabir Hossain 2017年

この方法は機能しました。データベース資格情報をユーザーに公開してもよい場合。localhost / laravel / .env
MasoodUrRehman

8

URLからパブリックを削除する4つの最良の方法。

他のトリックを使用してURLからpublicを削除した場合は、server.phpの名前をindex.phpに変更し、コアファイルパスに変更します。明らかに、それをしないでください。では、Laravelがこのような解決策を提供しないのは、それを行う適切な方法ではないためです。

1)Laravelのhtaccessを使用してURLからpublicを削除します

ルートに.htaccessファイルを追加すると、パブリックなしでWebサイトにアクセスできます

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

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</ifmodule>

2)ローカルに仮想ホストを作成してパブリックを削除します

ここでは、Windowsオペレーティングシステムのデモを行っています。しかし、私はステップを定義して、誰でも簡単にステップをたどれるようにします。特定のオペレーティングシステムについて、Googleで同じことを調べることもできます。

手順1: C:\ Windows \ system32 \ drivers \ etc \に移動し、管理者モードで「hosts」ファイルを開きます。

手順2:次のコードを追加します。ここでは、projectname.local domain name demoのデモを提供しています。好きなように指定できます。すべての場所で一定にしてください。

127.0.0.1  projectname.local

ステップ3:次にC:\xampp\apache\conf\extra、xamppユーザーとwampユーザー"C:\wamp\bin\apache\Apache2.4.4\conf\extra"および"httpd-vhosts.conf"ファイルを開きます。次のコードを追加します。

注:プロジェクトに従ってドキュメントルートを変更し、「hosts」ファイルに定義したドメイン名を追加します。

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

ステップ4:最後ですが重要なステップは、XamppまたはWampを再起動してURLにアクセスhttp://projectname.localすることです。そうすると、LaravelはパブリックURLなしで応答します。


3)Laravelでコマンドを実行してパブリックを削除します

ローカルで作業している場合は、ターミナルまたはコマンドラインツールから次のコマンドを実行するだけで、何もする必要はありません。その後、コマンドラインから提供されたURLを使用してWebサイトにアクセスできます。

   > php artisan serve

特定のIPでプロジェクトを実行する場合は、次のコマンドを実行する必要があります。LANで作業している場合、他の人がローカルからWebサイトにアクセスできるようにするには、コマンドに従ってIPアドレスを取得した後、コマンドラインで「ipconfig」を実行してIPアドレスを確認するだけです。

> php artisan serve --host=192.168.0.177

特定のポートを持つ特定のIPでプロジェクトを実行する場合は、次のコマンドを実行する必要があります。

> php artisan serve --host=192.168.0.177 --port=77

4)ホストされているサーバーまたはcpanelのパブリックを削除します

ここに画像の説明を入力してください

プロジェクトの完了後、サーバーでプロジェクトをホストする必要があります。次に、ドメインのドキュメントルートをパブリックフォルダーに設定するだけです。以下のスクリーンショットを確認してください。

スクリーンショットのように、public_htmlにプロジェクトフォルダーがない場合は、ドキュメントルートをのように設定するだけです"public_html/public"

ここから引用


1
4つの方法はすべて良いですが、最初の解決策を使用して問題を解決しました。
Manisha

7

@Humble Learnerに追加し、アセットのURLパスを「修正」する適切な場所は/Illuminate/Routing/UrlGenerator.php/asset()であることに注意してください。

一致するようにメソッドを更新します。

public function asset($path, $secure = null)
{
    if ($this->isValidUrl($path)) return $path;
    $root = $this->getRootUrl($this->getScheme($secure));
    return $this->removeIndex($root).'/public/'.trim($path, '/');
}

これにより、スクリプト、スタイル、画像パスが修正されます。アセットパスのすべて。


6

XAMPPユーザーがlaravelのデフォルトのファイルシステムに触れずにURLからパブリックを削除するには、アプリケーションに仮想ホストを設定して、このjsutを実行します

  1. XAMPPコントロールパネルアプリケーションを開き、Apacheを停止します。最新のWindowsマシンではサービスとして実行される可能性があるので、Apacheモジュールの左側にあるチェックボックスをオンにしてください。

  2. 移動するC:/xampp/apache/conf/extraか、どこにあなたのXAMPPのファイルが配置されています。

  3. テキストエディターでhttpd-vhosts.confという名前のファイルを開きます。

  4. 19行目あたりで#NameVirtualHost *:80を見つけて、コメントを外すか、ハッシュを削除します。

  5. ファイルの一番下に次のコードを貼り付けます。

<VirtualHost *>
    ServerAdmin admin@localhost.com
    DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
    ServerName localhost
    ServerAlias localhost
    <Directory "C:/xampp/htdocs">
        Options Indexes FollowSymLinks Includes ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. これで、上記のコードをコピーして貼り付け、仮想ホストディレクトリを追加できます。たとえば、Eatery Engineというサイトで作業しているため、次のスニペットを使用すると、ローカルインストールでサブドメインを操作できます。
<VirtualHost eateryengine.dev>
    ServerAdmin admin@localhost.com
    DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
    ServerName eateryengine.dev
    ServerAlias eateryengine.dev
    <Directory "C:/xampp/htdocs/eateryengine">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. 次に、Windowsホストファイルにアクセスして、ホストを編集します。ファイルは次の場所にありますC:/Windows/System32/drivers/etc/hostsはにあります。ここ、hostsはファイルです。メモ帳で開きます。
  2. #localhostの名前解決はDNS自体で処理されます。

127.0.0.1 localhost

localhostの名前解決はDNS自体で処理されます。

127.0.0.1       localhost
127.0.0.1       eateryengine.dev #change to match your Virtual Host.
127.0.0.1       demo.eateryengine.dev #manually add new sub-domains.
  1. Apacheを再起動してすべてをテストします。

元の記事はここにあります


5

Laravelセットアップにパブリックフォルダーを配置する理由は常にあります。パブリック関連のすべてのものがパブリックフォルダー内に存在する必要があります。

IPアドレス/ドメインをLaravelのルートフォルダーに向けるのではなく、パブリックフォルダーに向けます。サーバーIpがルートフォルダを指すのは安全ではありません。で制限を記述しない限り.htaccess、他のファイルに簡単にアクセスできるためです。

.htaccessファイルに書き換え条件を書き込んで書き換えモジュールをインストールし、書き換えモジュールを有効にするだけで、ルートにpublicを追加する問題が解決されます。


3

私はこの問題の多くの解決策であることを知っています。最善かつ最も簡単な解決策は、ルートディレクトリに.htaccessファイルを追加することです。

私はこの問題に対して提供した回答を試しましたが、Laravelのauth:apiガードでいくつかの問題に直面しました。

更新されたソリューションは次のとおりです。

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

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

ルートディレクトリに.htaccessファイルを作成し、このコードを追加します。そして、すべてがうまくいく


2

Laravel 5.5

Laravelを初めてインストールした後、私は有名な「パブリックフォルダーの問題」に直面し、私が個人的にはWebで見つけた他のソリューションよりも「クリーン」であるこのソリューションを思いつきました。


実績

  • publicURIに単語が含まれていない
  • .env好奇心の強い人々からファイルを保護する

すべてを.htaccess使用してmod_rewrite、4つの単純なルールを使用して編集できます。


手順

  1. .htaccessファイルをpublic/.htaccessメインルートに移動します
  2. 以下のように編集します

私はすべてにコメントしたので、これまでに使用したことがない人にもはっきりとわかります(私はそう思います)(私mod_rewriteは専門家ではなく、その逆です)。また、ルールを理解するには、Laravelで、Billがに接続している場合https://example.comhttps://example.com/index.phpロードされていることを明確にする必要があります。このファイルにはheader("refresh: 5; https://example.com/public/")、リクエストをに送信するコマンドが含まれていますhttps://example.com/public/index.php。この2番目index.phpは、コントローラーとその他のものをロードする責任があります。

# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # RULES ORIGINALLY IN public/.htaccess ---
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    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}]
    # --- END

    # PERSONAL RULES ---
    # All the requests on port 80 are redirected on HTTPS
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

    # When .env file is requested, server redirects to 404
    RewriteRule ^\.env$ - [R=404,L,NC]

    # If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
    # N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
    # .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
    RewriteCond %{REQUEST_URI} ^/$
    RewriteRule ^(.*) /public/index.php [L]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
    # If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
    # e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
    #       Client asks for example.com/media/bamboo.jpg
    #       Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
    #       With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
    # --- END

</IfModule>

次のルール(元はpublic/.htaccess)は削除できます。実際、同じルールが最後の2つのルールでより詳細に明示されています。

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

編集:私はAbhinav Saraswatの解決策を逃しました、そして彼の答えは受け入れられたものでなければなりません。ファイルを変更せずにすべてのトラフィックをパブリックフォルダーにリダイレクトする、1つの単純で明確なルール。


2

まず、この手順を使用できます

Laravel 5の場合:

1. Laravelルートフォルダーのserver.phpの名前をindex.phpに変更します

2. .htaccessファイルを/ publicディレクトリからLaravelルートフォルダにコピーします。

ソース:https : //stackoverflow.com/a/28735930

これらの手順を実行した後、すべてのcssとスクリプトパスを変更する必要がありますが、これは面倒です。

ソリューションの提案helpers::asset機能を少し変更するだけです。

このために

  1. 開いた vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. 後藤130行目

  3. 書き込み"public/".$pathの代わりに$path

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }

2
ルール番号1:コアファイルを編集しないでください。簡単で見栄えがよくても、後で支払うことになります。
Janaka Dombawela

:@JanakaDombawelaため、私はそのように考えていない
フェルハトKOÇER

@JanakaDombawela私はそのように考えていません。Senerio1:経験豊富な開発者の場合:オープンソースコードはこの仕事用ですSenerio 2:開発者がジュニアの場合、経験を積むためにソースコードを編集する必要があります
FerhatKOÇER

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

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

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

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

mod_rewriteモジュールをアクティブ化します

sudo a2enmod rewrite

そしてApacheを再起動します

sudo service apache2 restart

.htaccessファイル内からmod_rewriteを使用するには(これは非常に一般的な使用例です)、デフォルトのVirtualHostを次のように編集します。

sudo nano /etc/apache2/sites-available/000-default.conf

「DocumentRoot / var / www / html」の下に次の行を追加します。

<Directory "/var/www/html">
AllowOverride All
</Directory>

サーバーを再起動します。

sudo service apache2 restart

1

私は以前にいくつかの記事を読んだことがあり、それはうまく機能していますが、安全かどうかは本当にわかりません

    a. Create new folder local.
    b. Move all project into the local folder expect public folder.
    c. Move all the content of public folder to project root.
    d. Delete the blank public folder
    f. Edit the index file. 

index.phpを編集します

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';

1

ルートフォルダーにLaravelを置くことをお勧めしない場合でも、回避できない場合があります。これらの場合、上記の方法はアセットでは機能しないため、htaccessを変更する簡単な修正を行いました。server.phpをindex.phpにコピーした後、.htaccessファイルを次のように編集します。

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

    RewriteEngine On

    ### fix file rewrites on root path ###
    #select file url
    RewriteCond %{REQUEST_URI} ^(.*)$
    #if file exists in /public/<filename>
    RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/$1 [L]
    ###############

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

    # Handle Front Controller...

    #RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
    #RewriteCond %{REQUEST_FILENAME} -f #
    RewriteRule ^ index.php [L]
</IfModule>

これは私がしなければならなかった迅速な修正でしたので、誰でもそれをアップグレードすることを歓迎します。


1

問題は、/ publicと入力しても、URLで引き続き使用できる場合です。そのため、public / index.phpに配置する必要がある修正を作成しました。

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

このコードの平和は、パブリックをURLから削除し、404を与え、パブリックなしでURLにリダイレクトします。


0

私が使用する別の方法は、htdocsまたはwwwでlnコマンドを使用してシンボリックリンク(LinuxではWinについて知らない)を作成することです。つまりln projectname/public project 、サイトはlocalhost / projectからアクセスできます。


0

さまざまな方法を使用して、URLからpublicキーワードを削除できます。

1)専用ホスティングを使用していて、ルートアクセス権がある場合は、仮想ホストを使用してURLからパブリックキーワードを削除できます。DocumentRootパスはpublicで指定する必要があります。したがって、これはパブリックディレクトリからインデックスを開始し、URLから削除します。

<VirtualHost *:80>
    ServerAdmin info@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2)ホスティングのルートアクセス権がない場合は、ルートディレクトリに新しい.htaccessファイルを生成し、以下のようにコードを配置する必要があります

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

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>

ここでより多くの参照を得ることができます。


0

ルートディレクトリに.htaccessファイルを作成し、以下のようなコードを配置します。

<IfModule mod_rewrite.c>
 #Session timeout

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

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

</IfModule>

/ publicディレクトリに.htaccessファイルを作成し、以下のようなコードを配置します。

<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}]

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

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

-1

この問題に対する最も効果的な解決策を見つけました。

ちょうどあなたを編集.htaccessして、ルートフォルダと、次のコードを記述します。他に何も必要ありません

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>

-1

私はここでいくつかの解決策を試してみましたが、このようにlaravel 5.2で動作するhtaccessを見つけました:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]



RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

禁止する別のファイルまたはフォルダがある場合、追加するだけです

RewriteRule ^your_file - [F,L,NC]

-1

多くのことを行う必要はありません。ルートディレクトリに.htaccessファイルを作成し、以下を貼り付けて保存するだけです。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

これにより、/ public / publicにリダイレクトされます
zanderwar

@ zanderwar、Laravelバージョンは何ですか?また、プロジェクトがメインディレクトリのサブディレクトリにないことを願っていますか?
Victor Ifeanyi Ejiogu

プロジェクトはルート、バージョンは5.6。*ですが、共有ホスティング上ではサブドメイン上にあります。残念ながら、このcPanelのインストールにより、サブドメインはpublic_html内にフォルダーを持つことになります
zanderwar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.