2017-07-28 2 views
2

URL書き換えを処理するために.htaccessファイルを使用してApacheで作成して実行するカスタムPHPアプリケーションがあります。私たちはPlesk OnyxでFPMを使用してNGINXの下で動作するように変換しようとしています。カスタムPHPアプリケーションでNGINXを正しく書き直して実行するにはどうすればよいですか?

https://somedomain.com/mypage (same as index/mypage) 
https://somedomain.com/index/sitemap 
https://somedomain.com/blog/some-article-name 

REQUEST_URIを取ると、ページの応答をレンダリングするためにそれを使用するのindex.phpファイルにこれらのURLのマップ:

アプリケーションのようなリンクを生成します。次のように

アプリケーションの構造がネストされている:

docroot (/) 

./index.php //handler for the request in/

./blog/index.php //handler for any request to /blog 

それぞれのindex.phpは、それがコントローラとアクションに要求をマッピングすることができるようにパス= {REQUEST_URI}を受信することを期待します?

NGINXがtryfilesと書き換えを使用してこれを行うには複数の方法を試しましたが、運はありません。書き直しを使用して私は働くことができますが、レンダリング/マイページや/インデックス/サイトマップはありません。

私は/ index/sitemapをヒットしようとすると、index.phpを実行するのではなくダウンロードします。私がブログを試しても同じことが起こります。実際に動作する唯一のパスは/です。他のすべての人がindex.phpファイルをダウンロードするだけです。

ここは私の設定ですが、どこが間違っていますか?

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { 
    expires 30d; 
    add_header Pragma public; 
    add_header Cache-Control “public”; 
    try_files $uri @fallback; 
} 

location/{ 
    #index index.php index.html index.html; 
    rewrite ^/([^?]*) /index.php?path=$1 break; 
    rewrite ^blog/([^?]*) /blog/index.php?path=$1 break; 
    #try_files $uri @fallback; 

}  

答えて

1

設定には複数の問題があります。私は最初のlocationブロックをあなたの質問とは何の関係もないと思われるので無視します。

最初のrewriteは常に一致するため、2番目のrewriteは決して照会されません。 2番目のrewriteは決して一致しません.nginxのURIは常に/で始まります。 rewrite?またはクエリ文字列を含まない正規化されたURIを使用するため、[^?]は無意味です。 rewrite...breakを使用すると、書き換えられたURIが同じ場所で処理されることになります。これは、PHPファイルを処理する機能がないためエラーです。詳細については、this documentを参照してください。 try_filesを使用して

ソリューションは、次のようになります。

location/{ 
    try_files $uri $uri/ /index.php?path=$uri&$args; 
} 
location /blog { 
    try_files $uri $uri/ /blog/index.php?path=$uri&$args; 
} 
location ~ \.php$ { ... } 

をより多くのためのthis documentを参照してください。

関連する問題