我需要将 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
重定向。redirect
是302
重定向。
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。