4

Apache HTTPd mod_rewrite ルールのほとんどを nginx の HttpRewrite モジュール (すべての動的要求で FastCGI を介して PHP-FPM を呼び出す) に変換しました。ハードロケーションで定義された単純なルールはうまく機能します:

location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }

このように mod_rewrite で解析される正規表現にまだ問題があります (ルール内で末尾のスラッシュを受け入れ、すべてのリクエストにクエリ文字列を追加していることに注意してください):

mod_rewrite

# File handler
RewriteRule ^([a-z0-9-_,+=]+)\.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L]

# Page handler
RewriteRule ^([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2 [QSA,L]

RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$   _core/frontend.php?route=$1/$2/$3 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2/$3 [QSA,L]

サイトの次のサーバー構成を考え出しましたが、リクエストを解析した後、一致しないルールに遭遇しました (例:; GET /user/auth):

nginxの書き換えを試みた

location / {
    # File handler
    rewrite ^([a-z0-9-_,+=]+)\.([a-z]+)?(.*)$                                /_core/frontend.php?type=$2&file=$1&$3 break;

    # Page handler
    rewrite ^([a-z0-9-_,+=]+)(\/*)?(.*)$                                     /_core/frontend.php?route=$1&$2        break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$                   /_core/frontend.php?route=$1/$2&$3     break;
    rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4  break;
}

filename.extファイル ハンドラー (単に) とページ ハンドラー (スラッシュで定義された最大 3 つのプロパティを持つ一意のルート リクエスト)を処理するために何を提案しますか?

これからまだ応答が得られていないため、location ~ \.php {}これらの書き換えルールの前に含まれている で定義されている PHP パーサーをオーバーライドするかどうかもわかりません。

ルート プロパティの数ごとに新しいルールを使用する必要なく、解析の問題を解決できればボーナス ポイントです。

4

1 に答える 1

2

私は次のルールを書くことになりました:

ファイルハンドラー

location ~ ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }

ファイル ハンドラーは名前と拡張子を取得し、それを type={ext}&file={name} に書き込みます。

ページハンドラー

location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }

ページ ハンドラー (この場合は最大 3 つの "ディレクトリ" を処理します) は、各区切り文字 (/) の間の文字列を取得し、正規表現の検証を行い、それをクエリ文字列として書き込みます。

これと私の元の構成の主な違いは、各エントリに独自のロケーション ハンドラーがありlast、最初の一致でそれを処理するルールがあるため、パフォーマンスがわずかに向上することです。

また、nginx はデフォルトでクエリ文字列を追加するため、正規表現が必要ないこともわかりました。これは、もう 1 つのパフォーマンスの向上です。

これ/web/_config/php.confは単なる FastCGI パススルー構成であり、nginx に同梱されているもの (通常は/etc/nginx/fastcgi.conf) は正常に動作するはずです。PHP のみを扱っている場合は、各ルールでこれを定義する必要はなく、インクルードを先頭に追加するだけであることに注意してください。

お役に立てれば。

于 2012-11-13T22:57:26.877 に答える