我正在尝试使用 Nginx 将 15 条不同的路由从文件夹重定向到子域(我已经阅读了一些有关此内容的帖子)。
我很困惑,因为这个重定向正在起作用:
rewrite ^/admin(.*) $scheme://admin.example.com/$1 301;
而这个不是(我的浏览器中的 URL 没有改变):
rewrite ^/app(.*) $scheme://apps.example.com/$1 301;
我错过了什么 ?
当时,我只有这 2 个重定向(稍后我需要 15 个更复杂的重定向)。
编辑:更多有关我的完整 nginx 配置的解释
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
passenger_enabled on;
rails_env production;
root /home/admin/rails/current/public;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# redirects
# admin
rewrite ^/admin(.*) $scheme://admin.example.com/$1 302;
# apps
rewrite ^/app(.*) $scheme://apps.example.com/$1 302;
}
编辑2:汤姆问道,我到底想做什么(我更愿意对 URL 保密):
GET http://example.com => http://apps.example.com
GET http://example.com/app => http://apps.example.com
GET http://example.com/app/iphone => http://apps.example.com/iphone
GET http://example.com/app/ipad => http://apps.example.com/ipad
GET http://example.com/support/iphone => http://apps.example.com/support/iphone
GET http://example.com/support/ipad => http://apps.example.com/support/ipad
GET http://example.com/legal/privacy?params=toto => http://apps.example.com/legal/privacy?params=toto
GET http://example.com/legal/terms?params=toto => http://apps.example.com/legal/terms?params=toto
GET http://example.com/legal/about => http://apps.example.com/legal/about
我还有一些 POST 需要重定向,但我认为我需要一个代理,不是吗?
提前致谢。
编辑3:以下是 Tom 回答后我的 GET 重定向:
# pages to redirect to admin.$host
location /admin { return 301 $scheme://admin.$host; }
# pages to redirect to apps.$host
location /app { return 301 $scheme://apps.$host; }
location /app/iphone { return 301 $scheme://apps.$host/iphone; }
location /app/ipad { return 301 $scheme://apps.$host/ipad; }
location /support/iphone { return 301 $scheme://apps.$host/support/iphone$is_args$args; }
location /support/ipad { return 301 $scheme://apps.$host/support/ipad$is_args$args; }
location /legal/privacy { return 301 $scheme://apps.$host/legal/privacy$is_args$args; }
location /legal/terms { return 301 $scheme://apps.$host/legal/terms$is_args$args; }
location /legal/about { return 301 $scheme://apps.$host/legal/about; }
效果非常好!
现在,我将打开一个新线程,因为我无法使用我的 proxy_pass 创建 POST 重定向。请参阅那里。
答案1
测试时使用 302 重定向,301 会被缓存。清除浏览器缓存并重新启动。当您对配置满意时,将下面的 302 更改为 301。
试试这个——我发布了几个例子,你可以自己解决剩下的问题。你应该阅读nginx 内部的评估顺序,但对于精确匹配来说这并不重要 - 它仅适用于正则表达式匹配。
请注意,这应该按照您的要求进行,但可能不是您想要的 - 请注意,您在示例中没有包含尾随斜杠。
看起来您只想将所有内容重定向到应用程序域,是这样吗?如果是这样,那就容易多了。但这是您所要求的,经过测试。
location /support/ipad {
# change to 301 when you're 100% happy with all redirects
return 302 http://example.com/support/ipad;
}
location /app/iphone {
return 302 http://example.com/app/iphone;
}
location ~* ^/\Z {
return 302 http://whatever;
}
使用正则表达式可能是一种更有效的方法,但如果您不重定向整个域,则单独执行它们可能是明智的。请注意,~* 表示后面跟着的是正则表达式,这些正则表达式在指定单个精确 URI 的正则表达式之后进行评估。
根据你所说的,根重定向需要有一个正则表达式,以确保它只重定向根域,而不是例如http://www.example.com/pagea.html。如果您希望一切都重定向,那就更容易了。
另外,你是这个意思吗?请注意结尾的斜线
GET http://example.com/ => http://apps.example.com/
^ 表示“URI 的开始”,即不带网站的 URL。这意味着它只会匹配网站的根目录,而不是任何文件夹。/Z 表示“URI 的结束”。您可以在浏览器标头中输出调试信息来帮助解决此问题
location whatever {
add_header Z_LOCATION "(any text you want)";
add_header URI $uri;
}