【问题标题】:How to permanently redirect all pages of a subdomain to a sub-path of the www domain?如何将子域的所有页面永久重定向到 www 域的子路径?
【发布时间】:2020-02-16 12:35:27
【问题描述】:

例如,我有这个网站:

我仍然托管那个旧网站,但我把它移到了这里:

我希望每个旧页面都指向每个新页面。像这样的永久重定向:

https://www.neuraxle.neuraxio.com/* ==> https://www.neuraxio.com/en/neuraxle/*

我是否需要为此托管服务器以手动编写 Python Flask 应用程序,该应用程序通过自定义重写重定向每个 URL?我想避免使用 DNS 进行编码。有我可以使用的 DNS 技巧吗?我使用 GoDaddy 来管理我的 DNS。

可选:如果对 DNS 没有什么可做的,你能提供一个示例 Flask URL 处理方法吗?是否有免费的托管服务可供我托管这个烧瓶应用程序?

【问题讨论】:

    标签: redirect flask url-rewriting dns cname


    【解决方案1】:

    这个有效的,被接受的赏金答案很差:

    @app.before_request
    def redirect_to_new_domain():
        FROM_DOMAINS = ['0.0.0.0:' + str(PORT), 'https://www.neuraxio.com', 'www.neuraxio.com', "neuraxio.com"]
        SUBPATH = "/en/neuraxle"
        TO_DOMAIN = 'www.neuraxle.org'
        urlparts = urlparse(request.url)
        print(urlparts, urlparts.netloc)
        if urlparts.netloc in FROM_DOMAINS and SUBPATH in urlparts.path:
            parsed = urlparts
            parsed = parsed._replace(netloc=TO_DOMAIN)
            parsed = parsed._replace(path=urlparts.path.replace(SUBPATH, ""))
            return redirect(parsed.geturl(), code=301)
    

    注意:我自己在这里的回答并没有完全回答原始问题,但至少可以编译。正如我现在回答的那样,我们也需要这个,除了我们还有一个子路径来重定向而不是重定向。

    【讨论】:

      【解决方案2】:

      这应该会有所帮助。

      有时您需要编写一个简单地从一个域重定向到另一个域的网站。例如,您可能在 yourusername.pythonanywhere.com 创建了一个网站,并且它变得足够流行,您决定升级到付费计划并将其托管在 www.yourdomain.com 上——但是那里有很多链接转到旧域,并且您希望他们继续工作。

      最好的解决方案是在 yourusername.pythonanywhere.com 上运行一个简单的网站,当它收到请求时,会将用户重定向到新域——因此对http://yourusername.pythonanywhere.com/something 的请求会自动重定向到http://www.yourdomain.com/something,等等。

      为此,您需要在两个域的“Web”选项卡上都有一个网站; www.yourdomain.com 上的那个是您的主站点,yourusername.pythonanywhere.com 上的那个是一个使用 Python 3.6 的简单 Flask 应用程序,flask_app.py 文件中包含以下代码:

      from flask import Flask, redirect, request
      
      app = Flask(__name__)
      
      from urllib.parse import urlparse, urlunparse
      
      FROM_DOMAIN = "yourusername.pythonanywhere.com"
      TO_DOMAIN = "www.yourdomain.com"
      
      @app.before_request
      def redirect_to_new_domain():
          urlparts = urlparse(request.url)
          if urlparts.netloc == FROM_DOMAIN:
              urlparts_list = list(urlparts)
              urlparts_list[1] = TO_DOMAIN
              return redirect(urlunparse(urlparts_list), code=301)
      

      或尝试以下方法

      How to redirect to an external domain in Flask?

      【讨论】:

      • 这似乎可行。它是否也适用于像这样的深层页面:https://www.neuraxle.neuraxio.com/something/something.html重定向到https://www.neuraxio.com/en/neuraxle/something/something.html
      • 上班不近。我接受了赏金,因为它是最后期限。
      【解决方案3】:

      您应该能够使用正则表达式,使用 Web 根目录中的或通过主机控制面板访问的 RewriteEngine.htaccess 文件进行重定向。由于您的措辞,我有点不确定移动的方向,所以以防万一,这里有两个方向和一些参考。

      如果您想从 subdomain to folder 重定向(根据您的示例,这似乎更有可能),您可以执行以下操作:

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^www\.neuraxle\.neuraxio.\com$
      RewriteCond %{REQUEST_URI} !^/en/neuraxle
      RewriteRule ^(.*)$ /en/neuraxle/$1 [L,NC]
      

      如果你想从folder to subdomain 重定向,你可以这样做:

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^www.neuraxio.com
      RewriteRule ^en/neuraxle/(.*)$ http://www.neuraxle.sample.com/$1 [L,R=301]
      

      一些额外的参考资料:

      编辑:另一个想法取决于您使用的部署选项/平台,您在问题中没有提到。

      实际上,再想一想,GoDaddy 确实允许 DNS 重定向。去 在右侧页面底部附近会有转发部分:

      在 SUBDOMAIN 中输入:www.neuraxle 并在 FORWARD TO 中选择 https:// 并输入 www.neuraxio.com/en/neuraxle/,这应该可以解决问题。我会保留mod_rewrite 的信息以防万一。

      【讨论】:

      • 那是带有 cPanel 的 PHP 服务器吗?那究竟是一种什么样的服务器?
      • mod_rewrite 在 Web 服务器中可用(Apachenginx 是最常见的),如果您使用共享主机,则可以通过 .htaccess 文件访问它们的配置public_html 或类似名称的 Web 根文件夹,或者通过主机的控制面板(其中 cPanel 是最常见的)。如果您不使用任何网络服务器而是直接从烧瓶提供服务,mod_rewrite 可能仍然是一个选项flask.palletsprojects.com/en/1.1.x/deploying/cgi
      • 您的 DNS 解决方案不起作用,并且似乎破坏了该站点。例如,尝试访问neuraxle.neuraxio.com
      • 如果“已破坏站点”是指有关连接不是私有的浏览器消息,则必须修复 SSL 证书以覆盖所有子域 - 例如此处所述的通配符证书:ca.godaddy.com/help/what-is-a-wildcard-ssl-certificate-567 否则,当我绕过关于非私人连接的警告时,该网站对我来说工作正常
      • 有办法避免一直购买通配符证书吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多