2012-07-24 24 views
5

En primer lugar, he intentado buscar preguntas similares, pero las soluciones a esas preguntas eran líneas de código específicas, que no podía personalizar para satisfacer mis necesidades.nginx reescribe todo para index.php excepto whitelist

Tengo una instalación de Codeigniter, y estoy tratando de migrar de Apache a nginx. Sin embargo, en Apache el .htaccess era bastante simple: tomaría una lista blanca y reescribiría todo lo demás en index.php.

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

Sin embargo, en nginx, he probado los try_files si y directivas, así como jugar un poco con ubicaciones, sin ningún resultado. Todavía soy nuevo en la forma en que nginx lee la configuración del servidor, y los tutoriales en línea fueron algo confusos de seguir.

Además, el index.php no estará en la raíz de la tela, pero en un subdirectorio server.

Debido a esto, también necesita asegurarse de que incluso las peticiones de URI que comienzan con/servidor no vaya al directorio, pero a index.php

Esta es mi configuración de host virtual nginx hasta ahora:

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

que ayuda a redirigir las solicitudes al index.php, pero no tiene una lista blanca. Agradecería que alguien pudiera generar un ejemplo de trabajo con una breve explicación de lo que hace cada parte.

Respuesta

12

Usaría la variable $uri y if en un bloque location para lograrlo.

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

También, como para el pathinfo security problems, (discussion) que es una buena práctica añadir

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

al bloque location ~ \.php$.

+0

¡Gracias, eso funcionó! También analizaré la información de pathinfo, parece interesante. – xiankai

+2

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

+0

De acuerdo con los documentos IfIsEvild, reescriba ... último; es seguro, pero las sugerencias son (por supuesto, esta es una wiki de algún tipo) bienvenida. – complex857

Cuestiones relacionadas