2012-07-24 10 views
5

Zuerst habe ich versucht, nach ähnlichen Fragen zu suchen, aber die Lösungen zu diesen Fragen waren bestimmte Codezeilen, die ich nicht anpassen konnte, um meine Bedürfnisse anzupassen.nginx schreibe alle in index.php außer whitelist

Ich habe eine Codeigniter-Installation, und ich versuche, von Apache zu nginx zu migrieren. In Apache war das .htaccess jedoch ziemlich einfach: Es würde eine Whitelist nehmen und alles andere in index.php umschreiben.

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

jedoch in nginx, ich habe die, ob und try_files Richtlinien ausprobiert, sowie Herumspielen mit Standorten, ohne Erfolg. Ich bin noch neu, wie Nginx liest die Server-Konfiguration, und die Online-Tutorials waren etwas verwirrend zu folgen.

Zusätzlich, die index.php wird nicht in der Web-Root, sondern in einem Unterverzeichnis server.

Aus diesem Grunde muß ich auch mit/Server geht nicht in das Verzeichnis Anfang sicher auch URI-Anforderungen machen, aber zu index.php

Das ist meine nginx virtuelle Host-Konfiguration so weit:

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; 
    } 
} 

Das hilft, Anfragen an index.php umzuleiten, hat aber keine Whitelist. Ich würde es begrüßen, wenn jemand ein funktionierendes Beispiel mit einer kurzen Erklärung dessen, was jeder Teil tut, erzeugen könnte.

Antwort

12

Ich würde die $uri Variable und if in einem location Block verwenden, um dies zu erreichen.

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

Auch, wie für die pathinfo security problems, (discussion) es ist eine gute Praxis

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

zum location ~ \.php$ Block hinzuzufügen.

+0

Danke, das hat den Trick! Ich werde auch in die Pathinfo-Sache schauen, es scheint interessant. – xiankai

+2

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

+0

Gemäß der IfIsEvild-Dokumentation, neu schreiben ... zuletzt; ist sicher, aber Vorschläge sind (natürlich ist das ein Wiki) willkommen. – complex857