2012-07-24 3 views
5

まず、私は同様の質問を検索しようとしましたが、これらの質問に対する解決策は特定のコード行であり、私のニーズに合わせてカスタマイズできませんでした。nginxはホワイトリストを除いてindex.phpをすべて書き換えます

私はCodeigniterをインストールしており、Apacheからnginxに移行しようとしています。しかし、Apacheでは、.htaccessは非常に単純でした:ホワイトリストをとり、他のものはすべてindex.phpに書き換えます。

RewriteEngine on 
RewriteCond $1 !^(index\.php|css|images|core|uploads|js|robots\.txt|favicon\.ico) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

は、しかしnginxの中で、私はifとtry_filesディレクティブを試してきただけでなく、無駄に、場所をいじり。私はまだ、どのようにnginxがサーバーの設定を読んでいるのか新しく、チュートリアルのオンラインはややこしいです。

さらに、index.phpはWebルートにはなく、サブディレクトリserverにあります。このため

は、私も/サーバーで始まるも、URI要求がディレクトリに行っていないことを確認する必要がありますが、index.php

にこれはこれまでのところ、私のnginxのバーチャルホストの設定です:

server { 
    listen 80; 
    server_name example.com; 

    root /home/example/public_html; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 


    location/{ 
     index index.htm index.html index.php; 
    } 

    location ~ \.php$ { 
     fastcgi_pass  unix:/var/run/php-fpm/example.sock; 
     include    fastcgi_params; 
     fastcgi_param  PATH_INFO $fastcgi_script_name; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 

    } 

    location ~* ^.*(/|\..*) { 
     try_files $uri $uri/ /server/index.php; 
    } 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 
} 

リクエストをindex.phpにリダイレクトするのに役立ちますが、ホワイトリストはありません。もし誰かがそれぞれの部品が何をしているかの簡単な説明をして、実例を生み出すことができたら、私はそれを感謝します。

答えて

12

locationブロックに$uri変数とifブロックを使用します。

location/{ 
    if ($uri !~ ^/(index\.php|css|images|core|uploads|js|robots\.txt|favicon\.ico)) { 
     rewrite^/server/index.php last; 
    } 
} 

また、pathinfo security problems、(discussion)用として、それはlocation ~ \.php$ブロックに

try_files $uri =403; 
fastcgi_split_path_info ^(.+.php)(.*)$; 

を追加することをお勧めです。

+0

ありがとう、それはトリックでした!私もpathinfoの事を見て、それは面白いようです。 – xiankai

+2

http://wiki.nginx.org/IfIsEvil http://wiki.nginx.org/Pitfalls – VBart

+0

IfIsEvildドキュメントによれば、書き直し...最後に;安全ですが、(もちろん、これは何らかの種類のwikiです)歓迎されています。 – complex857

関連する問題