Назад | Перейти на главную страницу

Преобразование для каталога .htaccess (Apache) в Nginx

Мой сайт ранее находился на сервере Apache. Это настраиваемый сайт на PHP с .htaccess почти в каждой папке. Мне удалось получить часть .htaccess в основном каталоге для работы с Nginx, но я не смог сделать то же самое с каталогом .htaccess директивы.

Вот некоторые из .htaccess файлы:

Основной .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^search(.+)/$ search.php?search=$1 [L]
RewriteRule ^search(.+)/page/(.+)/$ search.php?search=$1&page=$2 [L]
RewriteRule ^nonton/(.+)/$ download.php?download=$1 [L]
RewriteRule ^nonton/(.+)/(.+)/$ download.php?download=$1&size=$2 [L]
RewriteRule ^get/(.+)/$ get_dl.php?dl=$1 [L]
RewriteRule ^(.+)-live-streaming/$ tv.php?tv=$1 [L]
RewriteRule ^thumb/(.+)$ data/thumb.php?i=$1 [L]
RewriteRule ^sitemap.xml$ sitemap.php [L]
Options -Indexes

URL по стране:

RewriteEngine On
RewriteBase /country/

RewriteRule ^(.+)/$ index.php?country=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?country=$1&page=$2 [L]

URL по жанру:

RewriteEngine On
    RewriteBase /genre/

    RewriteRule ^(.+)/$ index.php?genre=$1 [L]
    RewriteRule ^(.+)/page/(.+)/$ index.php?genre=$1&page=$2 [L]

URL тега:

RewriteEngine On
RewriteBase /tag/

RewriteRule ^(.+)/$ index.php?tag=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?tag=$1&page=$2 [L]

URL страницы:

RewriteEngine On
RewriteBase /title/


RewriteRule ^page/(.+)/$ index.php?page=$1 [L]

Я пробовал онлайн .htaccess в конвертер Nginx, но он, похоже, не работает. Может ли кто-нибудь помочь мне преобразовать это .htaccess в Nginx?

Думаю, основная проблема здесь не в преобразовании правил, а в понимании того, где их следует использовать. По каталогу .htaccess контекст - это особенность Apache HTTPD, а Nginx не поддерживает такое поведение.

Эквивалент Nginx: location директива в вашем nginx.conf, например

http {
    . . .
    server {
        . . .

        location /country/ {
            rewrite ^/country/(.+)/$ /country/index.php?country=$1 break;
            rewrite ^/country/(.+)/page/(.+)/$ /country/index.php?country=$1&page=$2 break;
        }

        location /genre/ {
            rewrite ^/genre/(.+)/$ /genre/index.php?genre=$1 break;
            rewrite ^/genre/(.+)/page/(.+)/$ /genre/index.php?genre=$1&page=$2 break;
        }
    }
}

Здесь вы можете использовать rewrite правила из любых инструмент преобразования вы нашли, но вы также можете узнать, как преобразовать их самостоятельно, поскольку синтаксис чрезвычайно аналогичный:

  • Апачи RewriteRule директива: RewriteRule Pattern Substitution [flags]
  • Nginx's rewrite директива: rewrite regex replacement [flag];

Замены идентичны замены. Формат регулярного выражения (шаблона) такой же. Но:

  • В Nginx вы должны включить ведущие / к началу (также ^/, /country/ и т.д.).
  • Замены также относятся к корню, поэтому вы должны включить ведущие /country/ и т.п.
  • Тебе нужно ; в конце каждой строки правила.

В флаги есть эти эквиваленты:

  • [L] -> last внутри server {} и break внутри location {}.

    Эта часть на самом деле очень важна, так как большинство конвертеров не могут понять разницу в контексте!

    Но если эти директивы поместить в location, то last флаг следует заменить на break, иначе nginx выполнит 10 циклов и вернет ошибку 500.

  • [R=302] -> redirect

  • [R=301] -> permanent

Перезапись Apache условия лайк RewriteCond %{HTTP_HOST} ^example.com можно заменить в Nginx на if директивы: if ($http_host ~ "^example.com") { }, например

        location / {
            if ($http_host ~ "^example.com"){
                rewrite ^(.*)$ http://www.example.com/$1 redirect;
            }
            rewrite ^/(.+)-live-streaming/$ /tv.php?tv=$1 break;
        }

Остальное вы можете узнать, прочитав связанные руководства и используя инструмент преобразования в образовательных целях. (Я ранее ссылался на apache2nginx инструмент преобразования, который не может справиться с коренной относительностью и использовать break вместо того last. Winginx's Конвертер htaccess в nginx работает лучше.)