如何使用 Openshift v2 和 nginx 将根域重定向到 www?

如何使用 Openshift v2 和 nginx 将根域重定向到 www?

我无法重定向我的示例.com请求www.example.com现在它们都是不同的网站,但指向同一个应用程序。

背景:

我已经在 Openshift ver. 2 上安装了 php 7 和 nginx,使用。我为部署的应用添加了2个别名,如下:

  1. 应用程序URL:myapp.rhcloud.com;域名:www.example.com
  2. 应用程序URL:myapp.rhcloud.com;域名:example.com

我还在 CNAME 中添加了以下 DNS 详细信息:

  1. 名称:www.example.com;值:myapp.rhcloud.com
  2. 名称:@;值:www.example.com

我的 nginx 配置文件(erb)如下:

server {
    root              <%= ENV['OPENSHIFT_REPO_DIR'] %>/www;
    listen            <%= ENV['OPENSHIFT_PHP_IP'] %>:<%= ENV['OPENSHIFT_PHP_PORT'] %>;
    server_name       <%= ENV['OPENSHIFT_APP_DNS'] %>;
    index             index.php index.html index.htm <%= ENV['NGINX_EXTRA_INDEX'] %>;
    set_real_ip_from  <%= ENV['OPENSHIFT_PHP_IP'] %>;
    real_ip_header    X-Forwarded-For;

变成:

server {
    root              /path/to/my/app-root/folder/;
    listen            127.11.2.1:8080;
    server_name       myapp.rhcloud.com;
    index             index.php index.html index.htm ;
    set_real_ip_from  127.11.2.1;
    real_ip_header    X-Forwarded-For;

我尝试在我的 nginx 配置文件中添加另一个服务器块,如下所示:

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

然而我不确定应该用什么来代替example.com。

答案1

我没有使用 Openshift,但我觉得您的 DNS 设置有问题,您在其中为根域创建了 CNAME:

名称:@;值:www.example.com

根据 DNS 规范,您无法为根域创建 CNAME 记录。即使您的 DNS 服务器允许您这样做,也是行不通的。

查看这个问题看看为什么不允许这样做。

答案2

就 DNS 而言,正如另一个答案所指出的那样,您无法执行@ CNAME www,即无法从根指向子域。但是,执行相反的操作,www CNAME @即从子域指向根,应该是完全可以接受的,并且不必与域的 Web 端表示方式对称(例如,从网站角度来看,您仍然可以从根指向子域,即使您在 DNS 端执行完全相反的操作)。

就网站方式而言,将两个server定义放在同一个文件中似乎是有意义的,您只需在其中一个服务器www.前面手动添加前缀,例如。<%= ENV['OPENSHIFT_APP_DNS'] %>server_name www.<%= ENV['OPENSHIFT_APP_DNS'] %>;

或者,尽管这不是最有效的解决方案,但您也可以使用if单个server上下文中的语句(例如,带有的语句server_name .example.com;)进行条件重定向:

if ($host != "www.example.com") {
    rewrite ^   http://www.example.com$request_uri? redirect;
}

或者,如果您更喜欢漂亮但效率较低的代码,您也可以使用正则表达式:

if ($host !~ "^www\.") {
    rewrite ^   http://www.$host$request_uri?   redirect;
}

相关内容