将每个目录的 .htaccess (Apache) 转换为 Nginx

将每个目录的 .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

按国家/地区列出的网址:

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]

标签网址:

RewriteEngine On
RewriteBase /tag/

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

页面网址:

RewriteEngine On
RewriteBase /title/


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

我尝试过在线.htaccessNginx 转换器,但似乎失败了。有人能帮我将其转换.htaccess为 Nginx 吗?

答案1

我想这里的主要问题不是转换规则,而是了解应该在哪里使用它们。每个目录.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 的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 的重写状况在 Nginx 中可以使用以下方法RewriteCond %{HTTP_HOST} ^example.com替换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。Winginxlasthtaccess 到 nginx 转换器效果更好。

相关内容