php - 公開 - laravel url 変更



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

これは非常に一般的な質問であることは知っていますが、Laravel 5の有効なソリューションを見つけることができませんでした。

私は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を使用しています


Answer #1

いけない!

Laravelルートフォルダーの server.php 名前を index.php 変更して、 /public ディレクトリからLaravelルートフォルダーに .htaccess ファイルをコピーしないでください!!!

この方法で、誰でもファイル(たとえば .env )にアクセスできます。 自分で試してみてください。 あなたはそれを望んでいません!

行う

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

<IfModule mod_rewrite.c>
    RewriteEngine On

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

これにより、すべてのベースURIが /public フォルダーに静かに書き換えられます。 HTTP Authorization Header などのすべての Headers およびオプションのURIパラメーターもすべて、静かに /public フォルダーに渡されます。

それで全部です!


Answer #2

ララヴェル5.5

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

実績

  • URIに public 用語がない
  • 好奇心の強い人々から .env ファイルを保護する

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

手順

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

すべてをコメントしたので、 mod_rewrite 使用したことのない人(私が専門家であるということではなく、すべて反対です)にも明らかです(希望) また、ルールを理解するために、Laravelでは、Billが https://example.com に接続すると、 https://example.com/index.php がロードされることを明確にする必要があります。 このファイルには、コマンド header("refresh: 5; https://example.com/public/") が含まれてい https://example.com/public/index.php 。これは、リクエストを https://example.com/public/index.php 送信し 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つのシンプルで明確なルール。


Answer #3

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

ちょうどあなたを編集 .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>

Answer #4

これらの行をルートhtaccessフォルダーに追加してください。

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

Answer #5

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

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

Answer #6

ルートフォルダーに.htaccessファイルを追加し、次のコードを貼り付けて、yourdomainnameを独自のドメイン名に置き換えます

RewriteCondのRewriteEngine%{HTTP_HOST} ^(www。)?yourdomainname $ RewriteCond%{REQUEST_URI}!^ / public /

RewriteCond%{REQUEST_FILENAME}!-f RewriteCond%{REQUEST_FILENAME}!-d

RewriteRule ^(。*)$ / public / $ 1

RewriteCond%{HTTP_HOST} ^(www。)?yourdomainname $ RewriteRule ^(/)?$ /public/index.php [L]


Answer #7

1) L5で パブリックディレクトリを移動するための実用的な方法が見つかりませんでした。 bootstrap index.php でいくつかのことを変更できますが、いくつかのヘルパー関数は、そのパブリックディレクトリが存在するという仮定に基づいているようです。 正直なところ、パブリックディレクトリを移動するべきではありません。

2) MAMP を使用している場合、各プロジェクトの新しいvhostを作成し、各プロジェクトがそのパブリックディレクトリを提供する必要があります。 作成したら、次のように定義されたサーバー名で各プロジェクトにアクセスします。

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

Answer #8

@ rimon.ekjonのコメント:

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

それは私のために働いています。 しかし、/ publicディレクトリ内のすべてのリソースファイルは、asset()ヘルパーを使用したため、URLを検索および要求できませんでした。

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

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

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

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


Answer #9

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>

Answer #10

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

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

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


Answer #11

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

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

  2. C:/xampp/apache/conf/extra またはXAMPPファイルがある場所に移動します。

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

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

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

<VirtualHost *>
    ServerAdmin [email protected]
    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 [email protected]
    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. DNS内で処理される#localhost名前解決を探します。

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を再起動し、すべてをテストします。

元の記事は here


Answer #12

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

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

:上記の方法は初心者向けであり、仮想ホストのセットアップで問題に直面する可能性があります。最良の解決策は、ローカルマシンに仮想ホストをセットアップし、プロジェクトのパブリックディレクトリを指すことです。


Answer #13

これ が、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 ます。 それはすべて お楽しみです!


Answer #14

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

Laravel 5の場合:

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

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

ソース: share : share

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

解決策の提案 :単純に helpers::asset 関数を少し変更することができます。

このために

  1. vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. 行130行

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

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

Answer #15

ルートフォルダーに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>

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


Answer #16

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

index.phpに移動して、次の2行を見つけます。

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

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

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

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

Answer #17

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


Answer #18

私は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]

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


Answer #19

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

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

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

Answer #20

ベストアプローチ: パブリックを削除することはお勧めしません。代わりに 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 。 理由は、あなたのlaravelコード全体が安全だということです。なぜなら、パブリックディレクトリに1レベル下がっているからです。

方法1:

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

方法2:

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

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

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

これらの簡単な手順に従ってください

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

require 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 /を試してください。





laravel-5