2

おそらくあまり関係ありませんが、私の環境から始めましょう: Linux OS、Perl 5.10、Catalyst 5.80032、nginx 1.0.11。

質問のために、ポート 80 でmydomain.comをアプリの Web ページへのアクセス ポイントとして使用しているとします。/var/www/mydomainまた、私の Catalyst アプリケーションの物理的な場所として使用しましょう。この場合、静的コンテンツは にあり/var/www/mydomain/MyApp/root/ます。

アプリケーションを fastcgi サーバーとして開始します (からMyApp/script):

    > ./myapp_fastcgi.pl -l /tmp/myapp.socket -n 2 -p /tmp/myapp.pid -d

次の構成でnginxサーバーを起動します。

    server {
        listen       127.0.0.1:80;
        server_name  mydomain.com;

        location / {
            include        fastcgi_params;
            fastcgi_param  PATH_INFO  $fastcgi_script_name;
            fastcgi_pass   unix:/tmp/myapp.socket;
        }

        location /static {
            root   /var/www/mydomain/MyApp/root;
        }
    }

アプリに、http://mydomain.com/またはhttp://mydomain.com/products別のページとしてアクセスすると(によって処理されますMyApp::Controller::Products)、すべてが正常に機能するようです。

ここで課題と質問: URI プレフィックス (たとえば)を使用してアプリケーションのページを提供できるようにするには、 nginxをどのよう/some/prefixに構成する必要がありますか?

この場合、rootpage には としてアクセスしhttp://mydomain.com/some/prefix/、2 番目のページには としてアクセスする必要がありますhttp://mydomain.com/some/prefix/products

質問の 2 番目の部分は、リダイレクトとすべてのページで有効な URI を取得するには、アプリケーション コードをどのように変更する必要があるかということです。つまり$c->uri_for()、接頭辞付きのパスに対して同じ動作をするために、どのように、また同様のメソッドを (再) 記述する必要がありますか?

ダミーの簡単な調整を試してみました

    location /some/prefix {
        include        fastcgi_params;
        fastcgi_param  PATH_INFO  $fastcgi_script_name;
        fastcgi_pass   unix:/tmp/myapp.socket;
    }

しかし、もちろん、この方法では機能しません。そのため、Perl コードに移行してリダイレクトと URL の生成を操作する前に、手動で URL を入力しても応答を得ることができません。

4

1 に答える 1

0

nginxのようなディレクティブがありaliasます。次のように動作します。

の値を持つ URL があり、次のようにディレクティブでディレクティブhttp://my.domain.com/some/prefix/blabla.fileを使用する場合:aliaslocation

location /some/prefix {
   alias /var/www/mydomain/MyApp/root;
}

結果の URL は/var/www/mydomain/MyApp/blabla.file. なんで?ブロック内のaliasディレクティブはその値 ( value) をファイルを提供するための一時的なものとして使用し、リクエスト部分から一致するリクエストとトリムを使用するため、リクエストがここにあるときだけになり、これを値に追加すると、必要なものが得られます (もし私がよくわかりました)。locationaliasrootlocation/some/prefix/blabla.file/blabla.filealias

私たちの議論によると、コメントで私は2つのことを提案できます。まず、nginx でそのようなlocationブロックを追加できます。

location ~ ^/some/prefix(.*)$ {
   rewrite ^/some/prefix(.*)$ $1;
}

このディレクティブはから削除/some/prefix/some/prefix/products、あなただけを残します/products。次に、locationブロックを次のように変更します。

location / {
    include        fastcgi_params;

    # Here you provide for your Catalys real uri which was orignally provided by user
    fastcgi_param  REQUEST_URI $request_uri;

    fastcgi_param  PATH_INFO  $fastcgi_script_name;
    fastcgi_pass   unix:/tmp/myapp.socket;
}    

したがってREQUEST_URI、Catalys の param を変更せずにユーザー リクエストの値を持つように設定します。nginx変数$request_uri$uri. _ この最初の値は決して変更されず、2 番目の値は、たとえばrewriteディレクティブによって書き換えられるたびに変更されます。さらに、これは機能します。これは、リクエスト URL が常に最初にパターンの後に来るものだけにトリムされるlocation ~よりも優先度が高いためです。location //some/prefix

それは今役に立ちますか?

于 2013-01-30T20:20:26.310 に答える