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

URLtypes:

 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吗?

我想这里的主要问题不是关于转换规则,而是理解你应该在哪里使用它们。 per-directory .htaccess 上下文是Apache HTTPD特有的function,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; } } } 

在这里,您可以使用您find的任何转换工具中的rewrite规则,但您也可以学习如何自行转换它们,因为语法非常相似:

  • Apache的RewriteRule指令: RewriteRule Pattern Substitution [flags]
  • Nginx的rewrite指令: rewrite regex replacement [flag];

replacereplace相同。 正则expression式(模式)格式是相同的。 但:

  • 在Nginx中,你必须包含前导/开始(也是^//country/等)。
  • replace也是根相对的,所以你必须包括领导/country/
  • 你需要; 在每条规则的最后。

旗帜有这些等价物:

  • [L] – >在server {}内的last location {} break

    这部分实际上是至关重要的,因为大多数转换器不能理解上下文的差异!

    但是,如果这些指令放在一个locationlast标志应该被replace为break ,否则nginx会做10个周期并返回500个错误。

  • [R=302] – > redirect

  • [R=301] – > permanent

Apache的重写条件如RewriteCond %{HTTP_HOST} ^example.com可以在Nginx中用if指令replace: 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的ntaccess 转换器的htaccess效果更好。)