将 .htaccess 转换为 Ngix 规则

将 .htaccess 转换为 Ngix 规则

我需要将 htaccess 文件转换为 nginx 配置。我http://winginx.com/en/htaccess但是当我更新 nginx 配置文件时出现错误。

htaccess 文件内容如下:

DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php?king-rewrite=$0&%{QUERY_STRING} [L]
</IfModule>

它被转换成

# nginx configuration
 index index.php;
 location / {
 rewrite ^(.*)//(.*)$ /%1/%2 redirect;
 if (!-e $request_filename){
 rewrite ^(.*)$ /index.php?king-rewrite=$0&$query_string break;
 }
}

现在错误是:

无法保存配置文件:配置无效:nginx:[emerg] 未知“0”变量 nginx:配置文件 /etc/nginx/nginx.conf 测试失败

提前致谢。

答案1

至少有两行是错误的:

第一的:

rewrite ^(.*)//(.*)$ /%1/%2 redirect;

正确的应该是:

rewrite ^(.*)//(.*)$ /$1/$2 permanent;

在 nginx 中,您可以使用 $n 引用捕获的正则表达式,其中 n 从 1 开始。permanent等于301重定向。redirect302重定向。

rewrite ^(.*)$ /index.php?king-rewrite=$0&$query_string break;

正确的应该是:

rewrite ^(.*)$ /index.php?king-rewrite=$1 last;

这里$1是捕获的正则表达式。在 nginx 中,您不需要单独将查询字符串附加到重写中,它们会自动附加。如果您不想将现有查询字符串附加到重写的 URL,则可以?在重写版本后添加。last 意味着不会考虑进一步的重写规则。

根据 nginx 最佳实践,更复杂的配置将是这样的:

location ~ ^/(?<part1>[^/]+)//(?<part2>[^/]+)$ {
    rewrite ^ /$part1/$part2 permanent;
}

try_files $uri $uri/ /index.php?king-rewrite=$request_uri;

在这里,我们在location指令中使用命名的正则表达式捕获来捕获变量路径的各个部分。

然后我们使用try_files指令首先检查请求的 URL 是否存在,如果不存在,则将请求传递给 index.php。

相关内容