web-dev-qa-db-ja.com

ApacheからNginxへの変換(初心者)

PHPのNginxWebサーバーセットアップがあり、Nginxに移動したいので、これらの.htaccessルールをnginx.confファイルに変換したいと思います。

RewriteRule ^blog(|/)$ /data/core/site/blog.php
RewriteRule ^blog/post(|/)$ /data/core/site/blogpost.php

これまでのところ、これは私が持っているものです:

location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }

ただし、このページ( http://example.com/blog )にアクセスすると、ダウンロードするファイルが表示されます。サーバーにPHP andコンテンツを表示するには、どうすれば修正できますか?

完全なNginx構成:(WindowsでWinginxパッケージを使用):

server {
    listen 127.0.0.1:80;
    server_name localhost;

    root home/localhost/public_html;

    index index.php;

    log_not_found off;
    #access_log logs/localhost-access.log;

    charset utf-8;

    location ~ /\. { deny all; }
    location = /favicon.ico { }
    location = /robots.txt { }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

    location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }
}
3
user3052975

これは私の質問に対する修正です。問題について多くの調査を行った後、それは非常に簡単であることがわかりました。

server {
listen 127.0.0.1:80;
server_name virjox www.virjox;

root home/virjox/public_html;

index index.php;

log_not_found off;
#access_log logs/virjox-access.log;

charset utf-8;

sendfile on;

location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }  
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
    rewrite ^/(.*)\.html /$1\.php;
}
   location /blog {
     rewrite ^/blog(|/)$ /data/core/blog.php;
   }
}

これは完全に機能します。

1
user3052975

リクエストの処理

覚えておくべき基本的なルールは次のとおりです:nginxは1つの場所でリクエストを処理します(さらに強調することができます:および1つの場所のみ)。

読む: http://nginx.org/en/docs/http/request_processing.html

locationマッチング

読む: location ドキュメント

構成に基づいて、nginxは最初に/blogprefixの場所で一致し、次に\.php$regex場所であり、最終的には後者でリクエストを処理します。指定した構成では、スクリプトをrawファイルとしてダウンロードするのではなく、PHPに送信する必要があります。

ただし、これは構成が正しいことを意味するわけではありません。リクエストは/blogの場所では処理されないため、現時点では役に立ちません。

  1. 順序ベースの正規表現の場所でリクエストをフィルタリングしないようにすることをお勧めします。これは悪いことです(Apacheディレクティブの順序の感度の悪夢を覚えていますか?)。フィルタリングするには、代わりに最長一致ベースのプレフィックス位置を使用します。最終的に正規表現が必要な場合は、場所を相互に埋め込むことができます。
  2. fastcgi*ディレクティブを/blogの場所に直接配置してみませんか?次に、$fastcgi_script_name変数(ここでは/blogのバリアントとなるlocation一致から推測)を使用する代わりに、fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.phpを使用できます。ちなみに、$fastcgi_script_filenameにはすでに開始/が含まれているため、変数間に1つ追加する必要はありません。
  3. リダイレクトを回避できる場合は、リダイレクトの使用を避けてください。特にrewriteは避けてください。単純なユーザーリダイレクト(HTTPステータスコードを使用してクライアントに送信されるリダイレクト通知を介して行われるURL書き換え)は、returnを使用して実行できます。ここで行ったのは、内部リダイレクト(サーバー上でローカルに実行)でした。その唯一の用途は、URIを変更してからSCRIPT_FILENAMEパラメーターに使用することでした。

初心者に使用できます:

location /blog {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php;
    include fastcgi_params;

    # Useless here since SCRIPT_FILENAME will never be a directory indeed
    fastcgi_index index.php;

    location /blog/post {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_param SCRIPT_FILENAME $document_root/data/core/blogpost.php;
        include fastcgi_params;
    }
}
2
Bernard Rosset