
Soy nuevo en el motor de reescritura de nginx. Estoy intentando convertir mi antiguo archivo htaccess al formato de nginx, pero tengo algunos problemas.
# ------------------------------------------------------ #
# This redirects index.php to / #
# ------------------------------------------------------ #
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(index|index\.php)\ HTTP/
RewriteRule ^(index|index\.php)$ http://domain.com/ [R=301,L]
# ------------------------------------------------------ #
# This rewrites 'directories' to their PHP files, #
# fixes trailing-slash issues, and redirects .php #
# to 'directory' to avoid duplicate content. #
# ------------------------------------------------------ #
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)/$ http://twitstamp.com/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^.]+\.php\ HTTP/
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)\.php$ http://twitstamp.com/$1 [R=301,L]
# ------------------------------------------------------ #
# If it wasn't redirected previously and is not #
# a file on the server, rewrite to image #
# ------------------------------------------------------ #
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z0-9_\-@#\ "'\+]+)/?([a-z0-9_\-]+)?(\.png|/)?$ generation/image.php?user=${escapemap:$1}&template=${escapemap:$2} [NC,L]
Ese es mi archivo htaccess. Ahora esto es lo que tengo hasta ahora...
# ------------------------------------------------------ #
# This redirects index.php to / #
# ------------------------------------------------------ #
if ($request_uri ~* "^/index.php\??$") {
rewrite ^.*$ http://$host? permanent;
}
# ------------------------------------------------------ #
# This rewrites 'directories' to their PHP files, #
# fixes trailing-slash issues, and redirects .php #
# to 'directory' to avoid duplicate content. #
# ------------------------------------------------------ #
if (!-e $request_filename) {
rewrite ^(.*)$ $1.php;
last;
}
# ------------------------------------------------------ #
# If it wasn't redirected previously and is not #
# a file on the server, rewrite to image #
# ------------------------------------------------------ #
if (!-e $request_filename) {
rewrite ^([a-z0-9_\-@#\ "'\+]+)/?([a-z0-9_\-]+)?(\.png|/)?$ generation/image.php?user=$1&template=$2;
break;
}
La redirección index.php funciona bien, al igual que el nombre del "directorio" -> redirección del archivo php. Sin embargo, no sé cómo hacer varias cosas: implementar la corrección de la barra diagonal y redirigir externamente los archivos .php para no tener ningún archivo duplicado. Quiero que todas las páginas se vean limpias, como /help, /about, etc. Las páginas reales en el servidor tienen el formato /about.php. Además, no consigo que funcione la regla de reescritura de las imágenes. Quiero que cualquier cosa que no sea un archivo o directorio real (marca -e) y no un archivo reescribible (como/about) se redirija a generación/etc...
Respuesta1
Lo estás haciendo mal. A Nginx le encantan los bloques de ubicación, por ejemplo, redirigir /index.php a / lo harías.
location = /index.php {
rewrite ^ http://domain.com/$args permanent;
}
También querrás consultar try_files. En general, si estás usando un if en Nginx, es probable que lo estés haciendo mal.
Recomiendo leer esto para obtener una introducción básica sobre cómo Nginx usa bloques de servidor y bloques de ubicación:http://blog.martinfjordvald.com/2010/07/nginx-primer/