在 Rails Passenger 上设置 https 和 www 重定向,在 Amazon Linux 上的 Apache 上安装 WordPress

Setup https and www redirect on Rails Passenger and a WordPress installation on Apache on Amazon Linux

我要http://www.example.com, http://example.com to redirect to https://example.com.

托管在 https://example.com 的应用程序是 Rails Passenger 应用程序。

我在 /var/www/html/blog 中安装了 WordPress,并且我已将 /blog 别名为 /var/www/html/blog,这样 https://example.com/blog 将 运行 WordPress 博客。

然而,并非一切都如我所愿:

现在:

  1. http://www.example.com要去https://example.com,这个不错
  2. http://example.com 不会去 https://example.com.
  3. https://www.example.com 不会 https://example.com
  4. https://example.com/blog 在控制台中抛出异常,如下所示:Mixed Content: The page at 'https://example.com/blog/' was loaded over HTTPS, but requested an insecure script 'http://xx.xx.xxx.xxx/blog/wp-includes/js/wp-emoji-release.min.js?ver=4.6.1'. This request has been blocked; the content must be served over HTTPS. e @ (index):23
  5. http://example.com/blog 运行很好,但我需要它重定向到 https://example.com/blog **
  6. http://www.example.com/blog redirects to http://example.com/blog**

** 第 5 点和第 6 点,这可能是因为我将 WordPress url 设置为 http://example.com。如果我将它设置为 https://example.com,我将进入无限循环。

我可以获得有关如何修改我的 Apache 配置的建议吗?

/etc/httpd/conf/httpd.conf

LoadModule passenger_module /usr/local/rvm/gems/ruby-2.3.3/gems/passenger-5.1.0/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
 PassengerRoot /usr/local/rvm/gems/ruby-2.3.3/gems/passenger-5.1.0
 PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.3.3/wrappers/ruby
</IfModule>

<VirtualHost *:80>
    ProxyPreserveHost On
    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot /var/www/example/public
    # Redirect / https://example.com

    PassengerRuby /usr/local/rvm/gems/ruby-2.3.3/wrappers/ruby
    PassengerFriendlyErrorpages on

    # JkMount /tc* node1
    # JkMount /intro* node1

    # Relax Apache security settings
    <Directory /var/www/example/public>
        RailsEnv production
        Allow from all
        Options -MultiViews
        # Uncomment this if you're on Apache >= 2.4:
        # Require all granted

        RewriteEngine On
        RewriteBase /
        RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] OR
        RewriteRule ^(.*)$ https://%1/ [R=301,L]
    </Directory>

    <Directory /var/www/html/blog>
        PassengerEnabled off
        # Makes Wordpress's .htaccess file work
        AllowOverride all
    </Directory>
</VirtualHost>

Alias /blog /var/www/html/blog
Alias /.well-known/acme-challenge/ /var/www/example/.well-known/acme-challenge/
`

/etc/httpd/conf.d/ssl.conf

LoadModule ssl_module modules/mod_ssl.so

Listen 443

SSLPassPhraseDialog  builtin

SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300

SSLMutex default

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

SSLCryptoDevice builtin

<VirtualHost _default_:443>

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLProxyProtocol all -SSLv3

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

# to run in dev mode
RailsEnv production

# Be sure to point to 'public'!
DocumentRoot /var/www/example/public

# define server details
ServerName example.com
#ServerAlias www.example.com

# rails needs the header for its own processing
RequestHeader set X_FORWARDED_PROTO 'https'

# this is just passing a proxy to a localhost server
# ProxyRequests Off
# ProxyPreserveHost On
# <Proxy *>
# Order deny,allow
# Allow from all
# </Proxy>
# ProxyPass / http://localhost/
# ProxyPassReverse / http://localhost/

#<Directory /var/www/html/blog>
#  Options Indexes FollowSymLinks MultiViews
#  AllowOverride All
#  allow from all
#  Require all granted
#</Directory>

</VirtualHost>  

我使用以下方法将所有内容重定向到 https://example.com,但我无法让 https 为 /blog 工作:

httpd.conf

LoadModule passenger_module /usr/local/rvm/gems/ruby-2.3.3/gems/passenger-5.1.0/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
 PassengerRoot /usr/local/rvm/gems/ruby-2.3.3/gems/passenger-5.1.0
 PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.3.3/wrappers/ruby
</IfModule>

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ProxyPreserveHost On
    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot /var/www/example/public

    PassengerRuby /usr/local/rvm/gems/ruby-2.3.3/wrappers/ruby
    PassengerFriendlyErrorpages on

    # Relax Apache security settings
    <Directory /var/www/example/public>
        RailsEnv production
        Allow from all
        Options -MultiViews
        # Uncomment this if you're on Apache >= 2.4:
        # Require all granted

        RewriteEngine On
        RewriteCond %{SERVER_NAME} =www.adintern.com
        RewriteRule  ^(.*)$        https://adintern.com/ [L,R=301]

        RewriteCond %{HTTPS} off
        RewriteRule (.*)           https://adintern.com/

        RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
        RewriteRule ^(.*)$ https://%1/ [R=301,L]
    </Directory>

    <Directory /var/www/html/blog>
        PassengerEnabled off
        # Makes Wordpress's .htaccess file work
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Alias /blog /var/www/html/blog
Alias /.well-known/acme-challenge/ /var/www/example/.well-known/acme-challenge/

ssl.conf

LoadModule ssl_module modules/mod_ssl.so

Listen 443

SSLPassPhraseDialog  builtin

SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300

SSLMutex default

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

SSLCryptoDevice builtin

<VirtualHost _default_:443>

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLProxyProtocol all -SSLv3

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

# to run in dev mode
RailsEnv production

# Be sure to point to 'public'!
DocumentRoot /var/www/example/public

# define server details
ServerName example.com

# rails needs the header for its own processing
RequestHeader set X_FORWARDED_PROTO 'https'

# this is just passing a proxy to a localhost server
# ProxyRequests Off
# ProxyPreserveHost On
# <Proxy *>
# Order deny,allow
# Allow from all
# </Proxy>
# ProxyPass / http://localhost/
# ProxyPassReverse / http://localhost/

SSLCertificateChainFile /etc/letsencrypt/live/www.example.com/chain.pem

</VirtualHost>

对于 WordPress,将 HOMESITEURL 设置为:

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