specific redirects page examples another url-rewriting nginx

url-rewriting - redirects - nginx rewrite specific url



Reescribe todas las solicitudes a index.php con nginx (8)

En mi configuración de Apache tengo la siguiente regla de reescritura simple que

  1. a menos que el archivo exista se reescribirá en index.php
  2. en las URL nunca ves la extensión de archivo (.php)

¿Cómo puedo reescribir esto 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]

Así es como se ve mi bloque de servidores nginx 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; }


¿Usar nginx $ is_args en lugar de? Para cadenas de consulta GET

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



Esto es lo que funcionó para mí para resolver la primera parte 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; }

reescribe ^ ([^.] * [^ /]) $ $ 1 / permanente; reescribe las direcciones que no son archivos (direcciones sin extensiones de archivo) para tener una "/" al final. Hice esto porque me encontré con "acceso denegado". mensaje cuando intenté acceder a la carpeta sin él.

try_files $ uri $ uri / /index.php = 404; se toma prestado de la respuesta de SanjuD, pero con un redireccionamiento adicional de 404 si todavía no se encuentra la ubicación.

fastcgi_index index.php; era la última pieza del rompecabezas que me faltaba. La carpeta no se redirigió al index.php sin esta línea.


La configuración simple y plana sin reescribir 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; }


La solución perfecta Lo probé y logré obtener mi página de índice cuando agregué este código en el archivo de configuración de mi sitio.

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

En el archivo de configuración mismo se explica que en "Primero intento de servir la solicitud como archivo, luego como directorio, luego vuelvo a index.html en mi caso es index.php ya que estoy proporcionando la página a través del código php.


Para pasar las variables get también usa $args :

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


Si desea pasar solo el index.php (ningún otro archivo php se pasará a fastcgi) a fastcgi en caso de que tenga rutas como esta en un marco como codeigniter

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


1, a menos que el archivo exista, se reescribirá en index.php

Agregue lo siguiente a su location ~ /.php$

try_files = $uri @missing;

esto primero intentará servir el archivo y, si no se encuentra, se moverá a la parte @missing . así que también agregue lo siguiente a su configuración (fuera del bloque de location ), esto lo redirigirá a su página de índice

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

2 en las URL nunca ves la extensión de archivo (.php)

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

y la configuración de ejemplo del enlace:

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