我对 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
不惜一切代价避免使用自动化工具,因为从定义上讲,这些工具缺乏正确转换规则的大脑。Apache 和 nginx 方式之间没有简单的一对一匹配。它们有两种不同的思维方式。因此,您需要了解你在做什么并使用 nginx 方式进行配置。在我看来,这是一个复杂的问题,超出了自动化工具的范围。
关于规则:
RewriteCond %{HTTP_HOST}
与主机匹配有关。在 nginx 端,它通过server_name
。语法可能不同:请查看文档。RewriteCond %{QUERY_STRING} ^$
表示您明确希望 QUERY_STRING 值为空。如果您必须这样做,请使用if
块匹配$args
是空的。这是一个例外因为我找不到更好的方法:if
应尽可能避免。您应该将块放在隔离正确 URI 的if
中。location
- RewriteRule 也可以通过以下组合来替换
location
和return
(首选方式)或rewrite
(应尽量避免)。使用 时location
,请尝试使用字首尽可能多地定位,因为正则表达式位置评估确实较慢。因此,基于性能,最好尽可能避免使用它们。
要获得有关如何获得干净且可扩展的配置的建议,请听 nginx 发明者在 nginx.conf 用户会议上主持的演讲:使用 nginx 进行可扩展配置