将 htaccess rewritecond 转换为 nginx

将 htaccess rewritecond 转换为 nginx

我对 nginx 还很陌生,但之前有过 apache 重定向的经验。我将子域名转换为子文件夹,需要一些帮助来使我的交换机的重写规则正确。子域名托管在 apache 服务器上,新子目录托管在我的新 nginx 服务器上。

下面是包含我想要的重定向的工作 htaccess 文件:

Options +FollowSymlinks 
RewriteEngine On

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale/(.*)$ http://www.frenchentree.com/property-for-sale/search/$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale$ http://www.frenchentree.com/property-for-sale/search? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^for-sale-details(.*) http://www.frenchentree.com/property-for-sale/details$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^buyer-registration(.*)$ http://www.frenchentree.com/property-for-sale/buyer-registration? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^advertise-with-us(.*)$ http://www.frenchentree.com/property-for-sale/advertise-with-us? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^favourites(.*)$ http://www.frenchentree.com/property-for-sale/favourites? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^saved-searches(.*)$ http://www.frenchentree.com/property-for-sale/saved-searches? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^system(.*)$ http://www.frenchentree.com/property-for-sale/system$1? [R=301,NE,NC,L]

RewriteCond %{HTTP_HOST}  ^france-property\.frenchentree\.com$ [NC]
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^$ http://www.frenchentree.com/property-for-sale/? [R=301,NE,NC,L]

我已经通过 winginx 转换器运行它,它输出以下内容:

# nginx configuration
location / {
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale/(.*)$ http://www.frenchentree.com/property-for-sale/search/$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale$ http://www.frenchentree.com/property-for-sale/search? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/for-sale-details(.*) http://www.frenchentree.com/property-for-sale/details$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/buyer-registration(.*)$ http://www.frenchentree.com/property-for-sale/buyer-registration? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/advertise-with-us(.*)$ http://www.frenchentree.com/property-for-sale/advertise-with-us? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/favourites(.*)$ http://www.frenchentree.com/property-for-sale/favourites? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/saved-searches(.*)$ http://www.frenchentree.com/property-for-sale/saved-searches? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/system(.*)$ http://www.frenchentree.com/property-for-sale/system$1? redirect;
}
if ($http_host ~* "^france-property\.frenchentree\.com$"){
rewrite ^/$ http://www.frenchentree.com/property-for-sale/? redirect;
}
}

我对上述内容持怀疑态度,原因有二... 1.因为子域托管在另一台服务器上,因此我怀疑我需要服务器级重定向,如下所示:

server {
   server_name france-property.frenchentree.com;
   rewrite ^/for-sale/(.*) $scheme://www.frenchentree.com/property-for-sale/search/$1 permanent;
   rewrite ^/for-sale-details(.*) $scheme://www.frenchentree.com/property-for-sale/details$1 permanent;
   rewrite ^/buyer-registration(.*) $scheme://www.frenchentree.com/property-for-sale/buyer-registration$1 permanent;
   etc
   etc
   etc

}

2. 因为我知道在 nginx 中不应该使用 if 语句,所以可以避免。

有人能给我指出正确的方向吗,哪怕只有一个我可以复制的例子?我通常只会做一些测试,但是,这些网站是实时的、功能齐全的,而且很受欢迎,所以我想第一次就做对!

提前致谢!

干杯

马特

答案1

  1. 不惜一切代价避免使用自动化工具,因为从定义上讲,这些工具缺乏正确转换规则的大脑。Apache 和 nginx 方式之间没有简单的一对一匹配。它们有两种不同的思维方式。因此,您需要了解你在做什么并使用 nginx 方式进行配置。在我看来,这是一个复杂的问题,超出了自动化工具的范围。

  2. 关于规则:

    1. RewriteCond %{HTTP_HOST}与主机匹配有关。在 nginx 端,它通过server_name。语法可能不同:请查看文档。
    2. RewriteCond %{QUERY_STRING} ^$表示您明确希望 QUERY_STRING 值为空。如果您必须这样做,请使用if块匹配$args是空的。这是一个例外因为我找不到更好的方法:if应尽可能避免。您应该将块放在隔离正确 URI 的if中。location
    3. RewriteRule 也可以通过以下组合来替换locationreturn(首选方式)或rewrite(应尽量避免)。使用 时location,请尝试使用字首尽可能多地定位,因为正则表达式位置评估确实较慢。因此,基于性能,最好尽可能避免使用它们。

要获得有关如何获得干净且可扩展的配置的建议,请听 nginx 发明者在 nginx.conf 用户会议上主持的演讲:使用 nginx 进行可扩展配置

相关内容