Tengo un script PHP que maneja el enrutamiento de script y hace todo tipo de cosas elegantes. Originalmente fue diseñado para Apache, pero estoy tratando de migrarlo a nginx para algunas de mis cajas. En este momento, estoy tratando de suavizar las cosas en un servidor de prueba.
Entonces, la forma en que funciona el script es que intercepta todo el tráfico HTTP para el directorio (en Apache) usando un .htaccess
archivo. Así es como se ve:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>
Muy claro. Todas las solicitudes se ejecutan index.php
, simple y llanamente.
Estoy tratando de imitar ese comportamiento en nginx, pero aún no he encontrado una manera. Alguien tiene alguna sugerencia?
Aquí hay una copia de mi nginx.conf
archivo en este momento. Tenga en cuenta que fue diseñado para que yo solo trate de hacerlo funcionar; principalmente un trabajo de copiar / pegar.
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type text/plain;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name swingset.serverboy.net;
access_log /var/log/nginx/net.serverboy.swingset.access_log;
error_log /var/log/nginx/net.serverboy.swingset.error_log warn;
root /var/www/swingset;
index index.php index.html;
fastcgi_index index.php;
location ~ \.php {
include /etc/nginx/fastcgi_params;
keepalive_timeout 0;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
}
.php
, por ejemplo, esto funcionará:/doesNotExist.ph
pero esto no funcionará (obtendrá 404 en su lugar):/doesNotExist.php
¡Lo descubrí por mi cuenta! ¡Si!
Todo lo que necesitaba para el
location
bloque era:Todo lo demás permaneció en gran medida igual.
fuente
Para preservar los argumentos GET, use lo siguiente:
$ is_args se convierte en '?' si $ args no está vacío
O incluso más simple:
fuente
.php
, por ejemplo, esto funcionará:/doesNotExist.ph
pero esto no funcionará (obtendrá 404 en su lugar):/doesNotExist.php
Después de configurar el directorio raíz, agregue esto
Según su necesidad, puede cambiar la expresión regular ya que necesita gobernar query_string a index.php
fuente
if
lograr lo que está pidiendo. wiki.nginx.org/IfIsEvilUn error muy importante tener cuidado de cuando su destino es un archivo PHP es para asegurarse de que lo
return
/rewrite
regla que su uso no reemplaza lalocation ~ \.php
directiva. Si esto sucede, nginx servirá su archivo PHP sin procesarlo, revelando el código fuente PHP. Esto puede ser catastrófico.La forma más segura ya está disponible,
location / { try_files $uri $uri/ /index.php; }
Asegúrese de establecer también
index index.php
en sulocation /
bloque y descomentar ellocation ~ \.php
bloque incluido en el archivo de configuración predeterminado.fuente