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
- a menos que el archivo exista se reescribirá en index.php
- 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; }
Aquí está la respuesta a su segunda pregunta:
location / {
rewrite ^/(.*)$ /$1.php last;
}
es trabajo para mí (basado en mi experiencia), significa que todos tus blabla.php se reescribirán en blabla
como http://yourwebsite.com/index.php a http://yourwebsite.com/index
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;
}
}