En mi configuración de apache tengo el siguiente simple regla de reescritura que

  1. a menos que el archivo existe se rewrite index.php
  2. en las direcciones url que usted nunca ver la extensión del archivo (.php)

¿cómo puedo volver a escribir este en nginx?

#
# Redirect all to index.php
#
RewriteEngine On

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} (/[^.]*|\.)$ [NC]
RewriteRule .* index.php [L]

He aquí cómo mi servidor nginx bloque se ve como ahora, pero no funciona 🙁

root /home/user/www;
index index.php;

# Make site accessible from http://localhost/
server_name some-domain.dev;


###############################################################
# exclude /favicon.ico from logs
location = /favicon.ico {
    log_not_found off;
    access_log off;
}   

##############################################################
# Disable logging for robots.txt
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}   

##############################################################
# Deny all attempts to access hidden files such as 
# .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}   

##############################################################
#   
location /{ 
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php$args;
    fastcgi_pass    127.0.0.1:9000;
}   

###############################################################
# serve static files directly
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
    access_log off;
    expires    30d;
}   

###############################################################
# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root html;
}   

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#   
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # With php5-cgi alone:
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}
InformationsquelleAutor ptheofan | 2012-10-16

8 Comentarios

  1. 33

    1 a menos que el archivo existe se rewrite index.php

    Añada lo siguiente a su location ~ \.php$

    try_files = $uri @missing;
    

    este primero intentará servir el archivo y si no se encuentra se moverá a la @missing parte. así también se añade lo siguiente a tu config (fuera de la location bloque), este redireccionará a la página de índice

    location @missing {
        rewrite ^ $scheme://$host/index.php permanent;
    }
    

    2 en las direcciones url que usted nunca ver la extensión del archivo (.php)

    para quitar la extensión de php que lea la siguiente:
    http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/

    y el ejemplo de configuración desde el link:

    location /{
        set $page_to_view "/index.php";
        try_files $uri $uri/@rewrites;
        root   /var/www/site;
        index  index.php index.html index.htm;
    }
    
    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/site$page_to_view;
    }
    
    # rewrites
    location @rewrites {
        if ($uri ~* ^/([a-z]+)$) {
            set $page_to_view "/$1.php";
            rewrite ^/([a-z]+)$ /$1.php last;
        }
    }
    
    • Por desgracia, no realmente funcionan. Puedo obtener una respuesta vacía de nginx. En el registro de error que informa de los siguientes 2012/10/17 15:23:14 [alerta] 17437#0: proceso de trabajo 17440 salido de la señal 11 (colapsaba)
    • la combinación de los dos configs probablemente pierde cosas cuando se combinan como este, cómo funcionan, cuando sólo se trate de uno en uno?
    • u puede decirme la configuración de los niveles anidados también. esta configuración funciona bien en el primer nivel de las rutas
  2. 103

    Solución perfecta yo lo he probado y de éxito para obtener mi página de índice cuando tengo anexar este código en mi archivo de configuración del sitio.

    location /{
                try_files $uri $uri//index.php;
    }
    

    En el archivo de configuración en sí explicó que en el «Primer intento de servir a la solicitud como archivos, a continuación, el directorio, a continuación, caer de nuevo a index.html en mi caso es index.php como estoy proporcionando la página a través de código php.

    • Wow, eso es demasiado fácil.
    • Gracias @Jonathan
    • Esto funciona, pero conseguir que las variables no se pasa correctamente ya. Alguna idea de cómo hacer eso?
    • Creo que este va a hacer el truco: try_files $uri $uri/ /index.php?$args;
    • misma respuesta en fallas de servidor
    • trabajó inmediato, esto es lo que usted desea.
    • Eres mi héroe!
    • la mejor solución, gracias!
    • probar: try_files $uri $uri/ /index.php$is_args$args;
    • wow. esto funciona en mi nginx (windows)

  3. 56

    Para aprobar obtener las variables como bien de uso $args:

    location /{
        try_files $uri $uri//index.php?$args;
    }
    
  4. 15

    Plana y simple de configuración sin necesidad de volver a escribir, puede funcionar en algunos casos:

    location /{
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php;
    }
    
    • Bueno! Justo lo que estoy buscando, a mi me funciona y creo que es una solución óptima, más rápido que el de la reescritura.
    • Estoy de acuerdo, esta es una mejor solución. Si necesita cualquier otra cosa, a todos los que valdría la pena el esfuerzo de sobrecarga. iutinvg, +1 para una rápida ruta estática.
    • El Nginx documentación aconseja en contra de proxy de todas las llamadas a PHP: wiki.nginx.org/Pitfalls#Proxy_Everything
    • NGINX es contraria sólo en el caso de que tenga contenido estático a servir de bien. Si este no es tu caso, creo que esta es la mejor solución.
  5. 5

    Utilizar nginx $is_args en lugar de ? Para OBTENER las Cadenas de consulta

    location /{ try_files $uri $uri//index.php$is_args$args; }
    
  6. 1

    Aquí es lo que ha funcionado para mí, para resolver la parte 1 de esta pregunta:

        location /{
                rewrite ^([^.]*[^/])$ $1/permanent;
                try_files $uri $uri//index.php =404;
                include fastcgi_params;
                fastcgi_pass php5-fpm-sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_intercept_errors on;
        }
    

    reescribir ^([^.]*[^/])$ $1/permanente; reescribe del archivo de direcciones (direcciones sin las extensiones de archivo) para tener un «/» al final. Hice esto porque me estaba quedando en «Acceso denegado». mensaje cuando he intentado acceder a la carpeta sin ella.

    try_files $uri $uri//index.php =404; es tomado de SanjuD la respuesta, pero con un extra de 404 desviar si la ubicación aún no se encuentra.

    fastcgi_index index.php; fue la última pieza del puzzle que me faltaba. La carpeta no se reubica en el index.php sin esta línea.

  7. 0

    Si quieres pasar solo el index.php ( ningún otro archivo php se pasa a fastcgi ) a fastcgi en caso de tener rutas como esta en un framework como codeigniter

    $route["/download.php"] = "controller/method";
    
    
    location ~ index\.php$ {
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi.conf;
    }
    

Dejar respuesta

Please enter your comment!
Please enter your name here