1

私は今まで4時間探していましたが、まだこれを機能させることができません. ウェブルートに次のディレクトリがあります。

- application
    - assets
    - css
    - config
    - protected
        - .htaccess
    - ...
    - .htaccess
- framework
    - [Yii framework inside]
- .htaccess

私のウェブルートの .htaccess は、要求されたファイルまたはディレクトリが存在しない限り、 xxx/xxx に対するすべての要求をhttp://www.example.com/application/にリダイレクト/「書き換え」する必要があります。このようにして、.css、.js、およびその他のファイルの要求は引き続き機能します。

私の設定では、Yii が SEO に適した URL を想定していることを確認しました。また、index.php を使用する傾向はありません。したがって、次のようになります。

'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName'=>false,
        'rules'=>array(
            '' => 'site/index',
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),
    ),
    'request' => array(
        'baseUrl' => 'http://www.example.com',
    ),

Yii が example.com/application/site/login としてリンクを生成していたため、「リクエスト」は後で追加されました。リクエストにより、Yii は代わりに example.com/site/login を生成します。

私のウェブルートの.htaccessで、私はすべてを試しました。

  • 最初に、URL からサブディレクトリを「削除」することができました。インデックスページが表示されました。
  • 既存のディレクトリがすべて同じ URL にリダイレクトされるように、ルールを追加しようとしました。
  • 最初のルールが破られ、'application' が再び URL に含まれていましたが、css スタイルは読み込まれませんでした。
  • 現時点では css でインデックス ページを取得しましたが、今ではすべてがインデックス ページに移動します。

私の .htaccess は次のようになります。

RewriteEngine on

RewriteCond $1 !^application/
# if a directory or a file exists, use it directly
RewriteCond %{DOCUMENT_ROOT}/application/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/application/$1 -d
RewriteRule ^(.*)$ application/$1 [L]

# otherwise forward it to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^.*$ application/index.php

Mod_rewrite が有効になっています (以前は機能していたものがあるのでわかります)。Yii docsの例を見ました。このようなスタックオーバーフローに関する他の質問や他の多くの質問からの解決策を試しました。まだ運がありません。

誰か助けてくれませんか?


編集: 上記の .htaccess を使用すると、example.com へのリクエストは example.com/application で終了します。ただし、「アプリケーション」を再び「非表示」にしたいと思います (以前は機能していましたが、なぜ壊れたのかわかりません)。


.htaccess を次のように変更しました。

RewriteEngine on

RewriteCond $1 !^application/
# if a directory or a file exists, use it directly
RewriteCond %{DOCUMENT_ROOT}/application/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/application/$1 -d
RewriteRule ^(.*)$ application/$1 [L]

# otherwise forward it to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ /application/
RewriteCond %{HTTP_HOST} ^(www.)?brainfeeder.be$
RewriteRule ^$ application/$1 [L,QSA]

しかし、それでも www.brainfeeder.be/site/login のような URL で、サイト/インデックスであるデフォルトのコントローラー/アクションに移動します。私の条件やルールはまだ正確ではないようです。この問題に取り組むために私がセットアップした小さなテスト アプリケーションを参照してください。

私の Yii アプリはそこにあるので、'bootstrap' index.php ファイルを実行し、デフォルトのコントローラー/アクション、この場合はサイト/インデックスにアクセスします。「ログイン」ボタンをクリックすると、ログインフォームが表示されます。ただし、サイト/インデックス ビューにとどまります。


わかりました、もう一度 .htaccess を数回更新しました。今、私は次のような状況にあります:

  • www.example.com AND example.com は、www.example.com/application AND example.com/application に書き換えられます。
  • (www.)?example.com/existingfolder は、「existingfolder」のコンテンツを表示するだけです。
  • (www.)?example.com/var1/var2/../varn は (www.)?example.com/application/var1/var2/.../varn にリダイレクトされます

今私がやりたいことは、後者がリダイレクトされるのではなく書き換えられることだけです。そのため、訪問者は自分がディレクトリ「アプリケーション」にいることを知りません。

したがって、(www.)?example.com/var1/var2/.../varn は訪問者を正しいページに直接誘導します。

現時点での私の .htaccess の内容:

Options +FollowSymLinks
#IndexIgnore */*
RewriteEngine on

RewriteBase /

RewriteCond %{HTTP_HOST} ^(www.)?brainfeeder.be$
RewriteRule ^$ /application/ [L]

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L]

# The directory or file does not exist
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /application/$1 [L,R]

問題は、最後の RewriteRule で R フラグを失うと、「アプリケーション」内の index.php ファイルに移動しますが、たとえば example.com/site/login に移動すると、ログイン フォームではなくホームページが表示されることです。 .

おそらく、スクリプトは変数を認識しません。(それがあった場合、サイト/エラーがトリガーされます)したがって、これはexample.com/application/var1/var2としてではなく、example.com/applicationへのリクエストとして処理されます

今回は問題をよりよく説明できたことを願っています。今まで大変お世話になりました。

4

3 に答える 3

0

.htaccess を編集する必要はありません。Yii エントリ スクリプト (index.php) とデフォルトの .htaccess をサブディレクトリから webroot に移動するだけです (これらが public_html の直下に存在するようにします)。index.php と .htaccess をルート ディレクトリに移動すると、すべての Web リクエストは (サブディレクトリではなく) webroot の下の index.php に直接ルーティングされるため、URL の /subdirectory 部分が削除されます。

ファイルを移動した後、index.php を編集して、yii.php ファイル (Yii フレームワーク ディレクトリの下) と Yii 構成ファイル (main.php) への参照を更新する必要があります。最後に、assets ディレクトリを webroot に直接移動する必要があります。これは、Yii がデフォルトで、assets ディレクトリがエントリ スクリプトと同じ場所にあることを想定しているためです)。

必要なのはこれだけですが、さらに詳細が必要な場合は、ここでアプローチについて詳しく説明します。

http://muhammadatt.tumblr.com/post/83149364519/modifying-a-yii-application-to-run-from-a-subdirectory

于 2014-04-20T17:59:45.180 に答える