0

settings.ymlのsymfony1.4では、次のオプションを使用しています。

env:
  request:
    param: 
      relative_url_root: /name-of-app

アプリが使用するrelative_url_rootを指定します。したがって、すべてのアプリは異なるrelative_url_rootの下で実行されます。

問題は、symfony1.4ルーティングがこの相対URLルートを検出しないことです。たとえば、次のルートがある場合:

route_name:
  url:  /some-module/some-action
  param: { module: somemodule, action: someaction }

そして、symfonyにアクセスしようとすると、の代わりにhttp://myproject.local/name-of-app/some-module/some-action一致するルート名を検索しようとします。name-of-app/some-module/some-action/some-module/some-action

また、symfonyはこのrelative_url_rootを使用して画像へのリンクを試みるようになったため、画像はもう見つかりません。http://project.local/img/..画像はではなく経由でのみ到達可能であるためhttp://project.local/name-of-app/img

これを解決するための最良の方法は何ですか?

  1. どこかで「/」を削除する必要がありますか?
  2. どういうわけかhtaccessでRewriteBaseを使用する必要がありますか?
  3. htaccessを使用してREQUEST_URIの「name-of-app」を削除する必要がありますか?
  4. すべてのルーティングURLの前にname-of-app/?
  5. どういうわけか、/ name-of-appはある種のパスまたはプレフィックスであることをapacheに伝える必要がありますか?私たちの実稼働環境では仮想ホストを作成できないため、.htaccessまたはsymfony自体を使用してこれを解決する必要があることに注意してください。
  6. 非常に異なるソリューション。
4

2 に答える 2

2

それがrelative_url_rootあなたが本当に求めているものであるかどうかはわかりません。ドキュメントに記載されているように:

Relative_url_root

Relative_url_rootオプションは、フロントコントローラーの前のURLの部分を定義します。ほとんどの場合、これはフレームワークによって自動的に検出され、変更する必要はありません。

index.phpしたがって、またはfrontend_dev.phpなどの前のURLの一部です。

私の意見では、あなたができることは、sfPatternRoutingルートを一致させる前に、を拡張してURLのプレフィックス部分を削除する独自のルーティングクラスを作成することです。次に、このクラスをでのルーティングに使用しますfactories.yml

編集:私はどういうわけかあなたが異なるアプリケーション間で操作しているという事実を見逃しました。

一般に、relative_url_root異なるアプリへの呼び出しを分離することは絶対に良い考えではありません。私の意見では、最良の方法は、別々のフロントコントローラーと仮想ホストを使用して異なるサブドメインを持つことです。残念ながら、あなたはこのオプションに行くことができないと言います。

次に、次のいずれかの解決策を選択できます。

  1. .htaccessをいじって、呼び出しを適切なフロントコントローラーにリダイレクトします。呼び出しとmyurl.com/path-to-app1/something呼び出しを行います。app1.php/somethingmyurl.com/path-to-app2/somethingapp2.php/something

  2. ファイルを変更しindex.phpます。URLの最初の部分をキャッチし(path-to-app/)、その値に基づいて適切なアプリの構成をロードします(例$configuration = ProjectConfiguration::getApplicationConfiguration('app2', 'prod', false);)次に、URLのこの最初の部分があることを考慮してルートを変更する必要があります(たとえば、すべてのルート:path-to-actionは、URLを生成する関数に渡される変数で始まるか、configで定義されたパラメーターを使用します。

In apps/app1/config/app.yml
path_to_app: app1

In apps/app1/config/routing.yml
route1:
  url: <?php echo sfConfig::get('app_path_to_app') ?>/something
  ...
于 2013-02-20T14:59:57.540 に答える
1

ルーティングの修正:

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

RewriteCond %{HTTP_HOST} myproject.local
RewriteCond %{THE_REQUEST} /name-of-app* [NC]
RewriteRule ^(.*)$ dispatcher.php/$1 [QSA,L]

この書き換えルールを使用することにより、symfonyは/ name-of-appがルーティングのプレフィックスであり、どういうわけかこれと一致することを認識しているようですrelative_url_root。これで、コントローラーでsfRouteオブジェクトをvar_dumpすると、次のようになります。

object(sfRoute)[33]
  protected 'isBound' => boolean true
  protected 'context' => 
    array (size=7)
      'path_info' => string 'some-module/some-action' (length=10)
      'prefix' => string '/name-of-appp' (length=8)
      'method' => string 'GET' (length=3)
      'format' => null
      'host' => string 'myproject.local' (length=20)
      'is_secure' => boolean true
      'request_uri' => string 'https://myproject.local/name-of-app/some-module/some-action' (length=47)

Michalが提案したように、ルーティングルールを変更しなかったことに注意してください。また、Symfonyが理解しているように、私のアプローチrelative_url_rootはそれほど奇妙ではないと思います。

直接ファイルアクセスの修正:

https://myproject.local/name-of-app/some/path/to/a/file.extのようなリクエストをリダイレクトするためにhttps://myproject.local/some/path/to/a/file.ext、次のディレクティブを使用しました。

RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} ^/name-of-app
RewriteRule ^name-of-app/(.*)$ https://myproject.local/$1 [L]
于 2013-02-23T09:52:44.790 に答える