DigitalOcean 上的 Wordpress http://example.com 无法正常工作,但 https://example.com 和 http://www.example.com 的所有其他组合均可正常工作

DigitalOcean 上的 Wordpress http://example.com 无法正常工作,但 https://example.com 和 http://www.example.com 的所有其他组合均可正常工作

这是一个很难用谷歌搜索到的问题,甚至是标题。

我可以使用以下命令成功访问我的 Wordpress 网站:

http://www.example.com/

https://www.example.com/

https://example.com/

但这失败了:

http://example.com/

如果您尝试从该地址访问域名,您会看到一个蓝色的 DigitalOcean 品牌网页,上面有一张鲨鱼图片,并显示以下错误:“请通过 SSH 登录您的 droplet 以配置您的 LAMP 安装。”

我有一个 DigitalOcean droplet,运行 Ubuntu 16.04,带有 Apache 2 和多个域。其中一个域有一个从另一台主机迁移过来的 Wordpress 网站。该域的配置与我所有其他域相同,包括通过 letsencrypt 安装的证书。

我不认为我的问题出在证书上。我认为问题与 Wordpress 有关,因为我的服务器上的其他网站在所有 4 种情况下(http:// 和 https:// 以及 www 和非 www)都运行正常

这是我的(匿名).conf 文件:

    <VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com

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

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <IfModule mod_dir.c>
        DirectoryIndex index.php index.pl index.cgi index.html index.xh$
    </IfModule>

RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

这是 /var/www/example 中的 .htaccess 文件夹

        # BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
#test
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
# END WordPress

以下是我的 DNS 设置(已粘贴并匿名化):

        CNAME   
ftp.example.com is an alias of example.com. 

A   
example.com directs to 159.65.36.136

CNAME
www.example.com is an alias of example.com. 

NS  
example.com directs to ns1.digitalocean.com.    

NS  
example.com directs to ns2.digitalocean.com.    

NS  
example.com directs to ns3.digitalocean.com.    

这是我的 apache2ctl -S 的输出

            VirtualHost configuration:
*:443                  is a NameVirtualHost
        default server othersite1.com (/etc/apache2/sites-enabled/othersite1.com-le-ssl.conf:2)
        port 443 namevhost othersite1.com (/etc/apache2/sites-enabled/othersite1.com-le-ssl.conf:2)
                alias www.othersite1.com
        port 443 namevhost othersite2.co (/etc/apache2/sites-enabled/othersite2.co-le-ssl.conf:2)
                alias www.othersite2.co
        port 443 namevhost example.com (/etc/apache2/sites-enabled/example.com-le-ssl.conf:2)
                alias www.example.com
        port 443 namevhost othersite3.com (/etc/apache2/sites-enabled/othersite3.com-le-ssl.conf:2)
                alias www.othersite3.com
        port 443 namevhost othersite4.com (/etc/apache2/sites-enabled/othersite4.com-le-ssl.conf:2)
                alias www.othersite4.com
        port 443 namevhost othersite5.net (/etc/apache2/sites-enabled/othersite5.net-le-ssl.conf:2)
                alias www.othersite5.net
        port 443 namevhost othersite6.com (/etc/apache2/sites-enabled/othersite6.com-le-ssl.conf:2)
                alias www.othersite6.com
*:80                   is a NameVirtualHost
        default server example.com (/etc/apache2/sites-enabled/000-default.conf:1)
        port 80 namevhost example.com (/etc/apache2/sites-enabled/000-default.conf:1)
        port 80 namevhost othersite1.com (/etc/apache2/sites-enabled/othersite1.com.conf:1)
                alias www.othersite1.com
        port 80 namevhost othersite2.co (/etc/apache2/sites-enabled/othersite2.co.conf:1)
                alias www.othersite2.co
        port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1)
                alias www.example.com
        port 80 namevhost othersite3.com (/etc/apache2/sites-enabled/othersite3.com.conf:1)
                alias www.othersite3.com
        port 80 namevhost othersite4.com (/etc/apache2/sites-enabled/othersite4.com.conf:1)
                alias www.othersite4.com
        port 80 namevhost othersite5.net (/etc/apache2/sites-enabled/othersite5.net.conf:1)
                alias www.othersite5.net
        port 80 namevhost othersite6.com (/etc/apache2/sites-enabled/othersite6.com.conf:1)
                alias www.othersite6.com
    ServerRoot: "/etc/apache2"
    Main DocumentRoot: "/var/www/html"
    Main ErrorLog: "/var/log/apache2/error.log"
    Mutex rewrite-map: using_defaults
    Mutex ssl-stapling-refresh: using_defaults
    Mutex ssl-stapling: using_defaults
    Mutex ssl-cache: using_defaults
    Mutex default: dir="/var/lock/apache2" mechanism=fcntl 
    Mutex mpm-accept: using_defaults
    Mutex watchdog-callback: using_defaults
    PidFile: "/var/run/apache2/apache2.pid"
    Define: DUMP_VHOSTS
    Define: DUMP_RUN_CFG
    User: name="www-data" id=33
    Group: name="www-data" id=33

答案1

可能性 #1

看起来您的默认 VirtualHost *:80,使用配置文件与输出顶部的000-default.confnamevhost 匹配……;example.com

VirtualHost configuration:
    default server example.com (/etc/apache2/sites-enabled/000-default.conf:1)
    port 80 namevhost example.com (/etc/apache2/sites-enabled/000-default.conf:1)

然而,你希望它在这里匹配;

    port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1)
    alias www.example.com

可能发生的情况是,带有文字“请通过 SSH 登录到您的 droplet 以配置您的 LAMP 安装。”的页面是来自的默认内容/var/www/html

因此我会尝试删除/etc/apache2/sites-enabled/000-default.conf并确保与example.com正确的 VHost 匹配。

可能性 #2

检查您的设置wp-config.php,它应该与您的重定向最终指向的内容相匹配;

define('WP_HOME','https://example.com');
define('WP_SITEURL','https://example.com');

当 wordpress 与 apache 的要求不匹配时,这有时会导致 wordpress 出现问题。

进一步故障排除

另一件事是你已经粘贴了配置http://example.com:80/地点;

 <VirtualHost *:80>
ServerName example.com 
...
</VirtualHost>

然而,重写规则看起来会将所有请求反弹到 https://

RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

所以我们可能还需要查看 https 配置。

此外,您可能应该粘贴与一个特定请求相关的 access.log 和 error.log 的输出,以查看实际发生了哪些重定向。

另外,如果您仍然看不到问题,您可以打开重写日志;

 LogLevel alert rewrite:trace3

然后跟踪日志中的请求;

tail -f error_log|fgrep '[rewrite:' 

相关内容