Convertendo por diretório .htaccess (Apache) para Nginx

3

Meu site já estava em um servidor Apache. É um site PHP personalizado que tem .htaccess em quase todas as pastas. Consegui obter parte do .htaccess no diretório principal para trabalhar no Nginx, mas não consegui fazer o mesmo com as diretivas .htaccess por diretório.

Aqui estão alguns dos arquivos .htaccess :

Main .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 por país:

RewriteEngine On
RewriteBase /country/

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

URL por gênero:

RewriteEngine On
    RewriteBase /genre/

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

URL da tag:

RewriteEngine On
RewriteBase /tag/

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

URL da página:

RewriteEngine On
RewriteBase /title/


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

Eu tentei o conversor online .htaccess to Nginx mas parece falhar. Alguém por favor pode me ajudar a converter esse .htaccess em Nginx?

    
por Indriya 26.04.2017 / 13:50

1 resposta

4

Suponho que o principal problema aqui não seja converter as regras, mas entender onde você deve usá-las. Por diretório .htaccess o contexto é o recurso específico do Apache HTTPD e o Nginx doesn ' t suportar esse tipo de comportamento.

O equivalente Nginx é a diretiva location em seu nginx.conf , por exemplo

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

Aqui, você pode usar as regras rewrite de qualquer ferramenta de conversão que encontrou, mas também pode aprender como convertê-los por si mesmo, já que a sintaxe é extremamente semelhante:

  • Diretiva RewriteRule do Apache: RewriteRule Pattern Substitution [flags]
  • rewrite da diretiva do Nginx: rewrite regex replacement [flag];
As substituições são idênticas às substituições. O formato da expressão regular (padrão) é o mesmo. Mas:

  • No Nginx, você precisa incluir o / inicial no início (também ^/ , /country/ etc.).
  • Substitutos também são relativos à raiz, então você deve incluir os /country/ etc. principais.
  • Você precisa de ; no final de cada linha de regra.

As flags têm esses equivalentes:

  • [L] - > last dentro de server {} e break dentro de location {} .

    Esta parte é realmente crucial, pois a maioria dos conversores não consegue entender a diferença contextual!

    But if these directives are put inside a location, the last flag should be replaced by break, or otherwise nginx will make 10 cycles and return the 500 error.

  • [R=302] - > redirect

  • [R=301] - > %código%

As reescritas do condições do Apache, como permanent , podem ser substituídas em Nginx por RewriteCond %{HTTP_HOST} ^example.com diretivas : if , por exemplo

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

O resto você pode aprender lendo os manuais vinculados e usando a ferramenta de conversão para fins educacionais. (Anteriormente, eu estava vinculado à ferramenta de conversão apache2nginx que não conseguia lidar com a relatividade da raiz e usava if ($http_host ~ "^example.com") { } em vez de break . O htaccess para o conversor nginx funciona melhor.

    
por 26.04.2017 / 14:06