web-dev-qa-db-ja.com

Yii2 htaccess-フロントエンド/ウェブとバックエンド/ウェブを完全に隠す方法

私はかなり近いと思います。ウェブサイト(フロントエンド/ウェブ)と/adminパス(backend/web)にリダイレクトするhtaccessがあります。サイトは正常に表示され、CSSファイルがロードされているなど。

http:// localhost/yii2app / にアクセスすると、ホームページが読み込まれ、アドレスバーにリダイレクトされませんが、ページのすべてのURLにfrontend/webが表示されます。

http:// localhost/yii2app/admin -バックエンドのログインページを読み込みますが、アドレスバーの/ backend/web/site/loginにすぐにリダイレクトします((い)。

問題:frontend/backendパスがURL(アドレスバー、ページ上のリンク)に表示されています。

必要なもの:フロントエンド/バックエンドリンクを表示せずにサイト全体を動作させたい。プロジェクトのルートは、表示されずにfrontend/webから(見えないように)プルする必要があります。 http:// localhost/yii2app / はフロントエンド全体を実行し、 http:// localhost/yii2app/admin / はバックエンド全体を実行します。

どうして?このセットアップは、サーバー上でライブを行うと、かなりしっかりしていてエレガントになると思います。プロジェクトフォルダーをライブでサイトにプッシュできるようにしたいのですが、ローカルとサーバーを処理するためにハッキングする必要なく、問題なく機能します。

.htaccessディレクトリ内の/yii2appファイル:

Options -Indexes
RewriteEngine on

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/
    RewriteCond %{REQUEST_URI} admin
    RewriteRule .* backend/web/index.php [L]

    RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/
    RewriteCond %{REQUEST_URI} !admin
    RewriteRule .* frontend/web/index.php [L]
</IfModule>

これで、フロントエンドとバックエンドのWebディレクトリで、両方とも同じ.htaccessを持ちます:

RewriteEngine on

# if a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward the request to index.php
RewriteRule . index.php

/frontend/web/backend/webを見たくない:)

ルートのhtaccessでRewriteRuleを試して/adminをURLに追加しようとしましたが、/adminが存在しないと表示され続けました。 I[〜#〜] know [〜#〜]それは存在せず、存在させたくない。私はそれを相対パスにしたいです。すなわち:/ admin ==/backend/web。

別の言い方をしました。プロジェクトのルート( http:// localhost/yii2app / )にあるすべてのものを、frontend/webをロードしますが、表示しません。また、 http:// localhost/yii2app/admin をロードしてbackend/webをロードし、単に http:// localhost/yii2app/admin を表示します。明らかに、それぞれのcontroller/actionが添付されます。管理者は http:// localhost/yii2app/admin/site/login のようになります

注:私はどのファイルでも遊んでいません。これは、コンポーザを使用し、ドキュメントに従っている、標準のyii2の高度なセットアップです。これまでに遊んだのは、言及したhtaccessファイルだけです。

ありがとうございました!

30
Wade

あなたの唯一の目標がこれまでにないことを達成することである場合/frontend/webまたは/backend/web 、. htaccessルールを使用しなくても、次のことができます。

なぜwebフォルダーの内容を引き出してルートに配置しないのですか?エントリスクリプト内のフレームワークと設定ファイルを参照するパスを調整するだけでindex.php

Dir構造は次のようになります。

- yii2app/
    - frontend/
    - backend/
    - common/
    - .. other folders..
    - admin/
        - assets/
        - css/
        - index.php
    - assets/
    - css/
    - index.php

きみの yii2app/index.phpは次のようになります。

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/common/config/main.php'),
    require(__DIR__ . '/common/config/main-local.php'),
    require(__DIR__ . '/frontend/config/main.php'),
    require(__DIR__ . '/frontend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

そしてあなたの yii2app/admin/index.phpは次のようになります。

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../common/config/main.php'),
    require(__DIR__ . '/../common/config/main-local.php'),
    require(__DIR__ . '/../backend/config/main.php'),
    require(__DIR__ . '/../backend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

編集:あなたのエントリースクリプトは私のものとは異なって見えるかもしれませんが、これらの例でフレームワークファイルを見つけるためにパスを変更するというアイデアを得るべきです。

25
deacs

.htaccessメソッドでこれを試してください-

ステップ1

ルートフォルダーに.htaccessファイル、つまりadvanced/.htaccessを作成し、以下のコードを記述します。

Options +FollowSymlinks
RewriteEngine On

# deal with admin first
RewriteCond %{REQUEST_URI} ^/(admin) <------
RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L]
RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L]

RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/  <------
RewriteCond %{REQUEST_URI} ^/(admin)  <------
RewriteRule ^.*$ backend/web/index.php [L]


RewriteCond %{REQUEST_URI} ^/(assets|css)  <------
RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
RewriteRule ^js/(.*)$ frontend/web/js/$1 [L] 
RewriteRule ^images/(.*)$ frontend/web/images/$1 [L]

RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css)/  <------
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ frontend/web/index.php

:ローカルサーバーで試行している場合は、矢印記号が表示されている^/^/project_name/に置き換えます。セットアップが完了したら、これらの矢印記号<------を削除します。

ステップ2

次に、共通ディレクトリにcomponents/Request.phpファイルを作成し、このファイルに以下のコードを記述します。

namespace common\components;


class Request extends \yii\web\Request {
    public $web;
    public $adminUrl;

    public function getBaseUrl(){
        return str_replace($this->web, "", parent::getBaseUrl()) . $this->adminUrl;
    }


    /*
        If you don't have this function, the admin site will 404 if you leave off 
        the trailing slash.

        E.g.:

        Wouldn't work:
        site.com/admin

        Would work:
        site.com/admin/

        Using this function, both will work.
    */
    public function resolvePathInfo(){
        if($this->getUrl() === $this->adminUrl){
            return "";
        }else{
            return parent::resolvePathInfo();
        }
    }
}

ステップ

コンポーネントをインストールします。以下のコードをそれぞれfrontend/config/main.phpおよびbackend/config/main.phpファイルに記述します。

//frontend, under components array
'request'=>[
    'class' => 'common\components\Request',
    'web'=> '/frontend/web'
],
'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
],

// backend, under components array
'request'=>[
    'class' => 'common\components\Request',
    'web'=> '/backend/web',
    'adminUrl' => '/admin'
],
'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
],

ステップ4(オプション、ステップ3まで動作しない場合)

webディレクトリに.htaccessファイルを作成します

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?/$1 [L]

注:Apacheでmodの書き換えを有効にしていることを確認してください

それでおしまい!あなたのプロジェクトを試すことができます
www.project.com/adminwww.project.com

ローカルサーバー内
localhost/project_name/adminlocalhost/project_name

29
mohit

@deacsが言ったように、ファイルをfrontend/webからyii2app(ルートフォルダ)に移動し、yii2app「admin」にフォルダを作成し、backend/webからyii2app/adminにファイルを移動し、adminおよびyii2appの両方で.htaccessファイルを作成します次のコード:

Options +FollowSymLinks
IndexIgnore */*

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

次に、frontend/config/main.phpとbackend/config/main.phpの両方の設定ファイルmain.phpで、次のコードを使用してurlManagerコンポーネントを追加/変更します。

    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing' => false,
        'rules' => [
        ],
    ],

次に、次のコードを使用してyii2appのindex.phpを変更します。

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/frontend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/common/config/main.php'),
    require(__DIR__ . '/common/config/main-local.php'),
    require(__DIR__ . '/frontend/config/main.php'),
    require(__DIR__ . '/frontend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

また、次のコードでyii2app/adminのindex.phpを変更します。

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/config/bootstrap.php');
require(__DIR__ . '/../backend/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../common/config/main.php'),
    require(__DIR__ . '/../common/config/main-local.php'),
    require(__DIR__ . '/../backend/config/main.php'),
    require(__DIR__ . '/../backend/config/main-local.php')
);

$application = new yii\web\Application($config);
$application->run();

Yii2でSEOに優しいURLを完成させるために必要なことはそれだけです。私は苦労していたので、@ deacs answerから助けを得ました。

3
shivgre

最適なソリューションを探して2日間たった後、私はこのようにしました(共有ホスティングのホスト)。サブドメインを作成しますadmin.xxxxx.comそして、ドキュメントのルート/public_html/xxxxxx/backend/web
共有ホスティングではメインドメインのカスタムドキュメントルートを配置できないため、このソリューションを使用します。

アカウントのプライマリドメイン名を変更し、古いプライマリドメインをアドオンドメインとして追加します。この方法で、プライマリドメイン/新しいアドオンドメインに必要なルートフォルダを選択できます。 (新しいプライマリドメインはpublic_htmlを指すようになります。)

次に、フロントエンドの正しいドキュメントルート(現在のアドオンドメイン)をポイントします/public_html/xxxxxx/frontend/web

1
despotbg

これまでのところ、私にとって最も簡単で柔軟なソリューションは symlinks です。プロジェクトはどこにでも配置でき、ホスティングによって強制されたディレクトリへのシンボリックリンクのみを作成できます。たとえば、プロジェクトを~/domains/example.com/projectに配置し、public_htmlディレクトリへのシンボリックリンクを作成します。

cd ~/domains/example.com
# remove old public_html directory
mv public_html old_public_html
# create symlink for fronted
ln -s ./project/frontend/web public_html
# create symlink for backend in /admin subdirectory
ln -s ./project/backend/web public_html/admin

そして、フロントエンドにはhttp://example.com/、バックエンドにはhttp://example.com/admin/があります。

別のドメインでバックエンドが必要な場合(admin.example.com):

ln -s ~/domains/example.com/project/backend/web ~/domains/admin.example.com/public_html

長所

  1. ほとんど誰も理解していないねじれた書き換えルールはありません。
  2. プロジェクト全体がパブリックディレクトリにないため、ウェブサーバーやPHP.
  3. ホスティングに必要な任意の構造にプロジェクトを適合させることができます。
  4. 相対シンボリックリンクを使用する場合、バージョン管理下に置き、すべてのアプリをサブディレクトリとして単一のWebルートを作成できます。

短所

  1. いくつかの制限されたopen_basedir設定を持つホストがあり、それを制御できない場合、それを使用できない場合があります。
0
rob006

「deacs」の回答に従い、次のエラーが発生しました

Invalid Configuration – yii\base\InvalidConfigException
The directory does not exist: D:/wamp/www/yii2app/assets

次に、「yii2app」に「assets」フォルダを作成しましたが、動作します

---------- 2番目の方法------------------------

ファイルを移動せずに、次のリンクをたどることができます

https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-installation.md

---------- 3番目の方法-----------------------------

http://www.yiiframework.com/doc-2.0/guide-tutorial-shared-hosting.html

0
Aamir Sarwar