web-dev-qa-db-ja.com

ディレクトリごとの.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に変換するのを手伝ってくれませんか?

2
Indriya

ここでの主な問題は、ルールの変換ではなく、どこでルールを使用すべきかを理解することだと思います。ディレクトリごと_.htaccess_ context はApache HTTPD固有の機能であり、Nginxはこの種の動作をサポートしていません。

Nginxに相当するものは、_nginx.conf_の location ディレクティブです。例:.

_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ルールを使用できますが、構文がであるため、自分で変換する方法を学ぶこともできます。 )非常に類似:

  • Apacheの RewriteRule ディレクティブ:_RewriteRule Pattern Substitution [flags]_
  • Nginxの 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の書き換え conditions like _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の htaccessからnginxへのコンバーター うまく機能します。)

4
Esa Jokinen