0

我正在更新一个域名,该域名当前使用的是 HTTPS,并且有一个许多用户每天都在连接的 API。

我需要做的,基本上是通过 DNS/新服务器将所有流量重新路由到新域名。

例如

目前用户正在点击:https ://olddomain.com/api我们现在正在使用https://newdomain.com/api所以我需要重定向来自https://olddomain.com/api的所有调用,使用 php POST数据完整到https://newdomain.com/api

CNAME 似乎没有使用发布数据重定向它,并且它使 API 调用失败。CNAME 用于 olddomain.com 指向 newdomain.com,使用 apache2 mod rewrites 应该负责重定向,如果您导航到 olddomain.com,它会转发到 newdomain.com,但 POST 数据在某些情况下不会随之而来原因。新服务器同时具有旧域和新域 SSL 证书,因此应该是有效的。

这就是我的 000-default 在 /etc/apache2/sites-enabled/000-default 中的样子

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName newdomain.com
    ServerAlias newdomain.com

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^olddomain.com
    RewriteRule ^/(.*)$ https://newdomain.com/$1 [L,R=301]
    RewriteCond %{HTTP_HOST} ^www.olddomain.com
    RewriteRule ^/(.*)$ https://newdomain.com/$1 [L,R=301]

    DocumentRoot /var/www
    <Directory />
            Options FollowSymLinks
            AllowOverride ALL
    </Directory>
    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride ALL
            Order allow,deny
            allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>
</VirtualHost>


<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName newdomain.com
        SSLEngine on
        SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
        SSLCertificateFile /etc/apache2/ssl/certs/newdomain.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/private/newdomain.key
        SSLCertificateChainFile /etc/apache2/ssl/ssl_bundle.crt
        DocumentRoot /var/www/
</VirtualHost>

<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName olddomain.com
        ServerAlias www.olddomain.com
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^olddomain.com
        RewriteRule ^/(.*)$ https://newdomain.com/$1 [L,R=301]
        RewriteCond %{HTTP_HOST} ^www.olddomain.com
        RewriteRule ^/(.*)$ https://newdomain.com/$1 [L,R=301]

        SSLEngine on
        SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
        SSLCertificateFile /etc/apache2/ssl/certs/olddomain.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/private/olddomain.key
        SSLCertificateChainFile /etc/apache2/ssl/ssl_bundle.crt
        DocumentRoot /var/www/
</VirtualHost>
4

1 回答 1

0

您是否尝试使用 HTTP 状态 307(临时重定向)而不是 301?根据W3C 的 HTTP/1.1 状态代码定义,此方法将允许您保留重定向请求的原始 HTTP 方法(以及在 POST 的情况下的相关主体),尽管标准还要求用户代理要求确认在非 GET 和非 HEAD 的情况下来自用户。

例如,在您的 Apache 配置文件中,尝试替换以下行:

重写规则 ^/(.*)$ https://newdomain.com/ $1 [L,R=301]

经过:

重写规则 ^/(.*)$ https://newdomain.com/ $1 [L,R=307]

请注意,一些用户代理被报告不符合有关 HTTP 307 状态的标准(例如,不要求用户确认),而另一些则根本不理解它。因此,如果您选择使用此方法,我建议您使用您的目标浏览器仔细测试它,并在需要时寻找回退机制。

于 2013-07-28T05:28:26.857 回答