Как объединить перезаписи в цепочку в Nginx?

Как объединить перезаписи в цепочку в Nginx?

Я новичок в движке перезаписи nginx. Я пытаюсь преобразовать свой старый файл htaccess в формат nginx, но у меня возникли некоторые проблемы.

# ------------------------------------------------------ #
# 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]

Это мой файл htaccess. Теперь вот что у меня есть на данный момент...

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

Перенаправление index.php работает нормально, как и перенаправление имени "каталога" -> файла php. Однако я не могу понять, как сделать несколько вещей: реализовать исправление завершающего слеша и внешнее перенаправление файлов .php, чтобы у меня не было дубликатов файлов. Я хочу, чтобы все страницы выглядели чисто, например /help, /about и т. д. Настоящие страницы на сервере имеют формат /about.php. Кроме того, я не могу заставить работать правило перезаписи для изображений. Я хочу, чтобы все, что не является настоящим файлом или каталогом (флаг -e) и не перезаписываемым файлом (например, /about), перенаправлялось на generation/etc...

решение1

Вы делаете это неправильно. Nginx любит блоки местоположения, например, для перенаправления /index.php на / вам нужно это сделать.

location = /index.php {
    rewrite ^ http://domain.com/$args permanent;
}

Вам также следует изучить try_files. В общем, если вы используете if в Nginx, то, скорее всего, вы делаете это неправильно.

Я рекомендую прочитать это для базового введения в то, как Nginx использует серверные блоки и блоки местоположения:http://blog.martinfjordvald.com/2010/07/nginx-primer/

Связанный контент