【发布时间】:2016-03-31 01:29:24
【问题描述】:
我正在尝试找出我的虚拟主机文件的最佳配置,但我遇到了一些问题。
目前我有 2 个域:domain1.com 和 domain2.com
我在 IP 000.000.000.001 有 1 台服务器,它实际上托管了所有需要的文件。在这些文件中,您有一个 API (api.domain1.com) 和实际网站。
domain1.com 使用 Digital Ocean 的域名服务器并使用以下 DNS 记录:
A @ 000.000.000.001
CNAME * domain1.com.
出于 SEO 目的,我想将所有未发送到 api 子域的请求重定向到 www.domain1.com。 但是,我也只希望用户能够通过 SSL 连接浏览我的网站(和 API),我不希望用户能够通过 HTTP 使用它,所以我尝试将所有这些请求重定向到使用 HTTPS。证书由 LetsEncrypt! 提供。他们的自动安装对我的虚拟主机文件进行了更改,目前我有 4 个:
-
api.domain1.com.conf
<VirtualHost *:80> ServerName api.domain1.com DocumentRoot /var/www/api.domain1.com/web RewriteEngine on RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,QSA,R=permanent] </VirtualHost> -
api.domain1.com-le-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName api.domain1.com DocumentRoot /var/www/api.domain1.com/web ExpiresActive On /* ... */ <Directory /var/www/api.domain1.com/web> AllowOverride None Order Allow,Deny Allow from All <IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ app.php [QSA,L] </IfModule> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLCertificateFile /etc/letsencrypt/live/domain1.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain1.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/domain1.com/chain.pem </VirtualHost> </IfModule> -
domain1.com.conf
<VirtualHost *:80> ServerName domain1.com Redirect 301 / https://www.domain1.com </VirtualHost> -
domain1.com-le-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName www.domain1.com DocumentRoot /var/www/domain1.com ExpiresActive On /* ... */ RewriteEngine On RewriteCond %{HTTP_HOST} ^https://domain1.com RewriteRule ^/(.*)$ https://www.domain1.com/$1 [L,R=301] ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ErrorDocument 404 /404.html SSLCertificateFile /etc/letsencrypt/live/domain1.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain1.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/domain1.com/chain.pem </VirtualHost> </IfModule>
当我尝试访问该网站时,会发生以下情况:
http://test.domain1.com --> https://test.domain1.com FAIL
http://domain1.com --> https://www.domain1.com SUCCESS
http://www.domain1.com --> https://www.domain1.com SUCCESS
https://domain1.com --> https://domain1.com FAIL
https://www.domain1.com --> https://www.domain1.com SUCCESS
如您所见,第一个和第四个条目都失败了。他们都向我的访客返回 404 Not Found,这对我来说是不可接受的。第一个甚至显示 SSL 警告(我认为 LetsEncrypt! 不支持通配符,所以我认为无法阻止此警告?)
是什么导致了我的测试。没有重定向到 www.?
是什么导致我的第四个条目最终服务于 404?
现在我还希望我的第二个域 (domain2.com) 指向此服务器/文件。该域托管在不同的位置(我从朋友那里得到的)并且使用不同的名称服务器。我不能简单地更改名称服务器(我认为?),因为第二个域具有链接到它的电子邮件托管,它使用其他提供商的名称服务器。目前,该域还拥有自己的 Web 服务器(但将来会消失),托管在 000.000.000.002。现在,它使用
<meta http-equiv="refresh" content="0; url=https://www.domain1.com" />
在其 index.html 文件中添加标签以重定向到正确的服务器,但将来这必须在 DNS 记录中完成。
我应该怎么做?
总结一下:
- 我认为 CNAME * 是所有子域的通用名称?
- 我在虚拟主机文件中做错了什么?某些原因导致第四次重定向失败。
- 我应该如何处理指向我的第一个 IP 的第二个域?
- 还有其他方法只允许 HTTPS 连接吗? (这也应该在 API 虚拟主机上强制执行)。我听说过 HSTS,我应该实施吗?
一些 SEO 测试还指出,我需要 IP 重定向来进一步改善我的 SEO 结果。他们以此为例:
RewriteCond %{HTTP_HOST} ^000\.000\.000\.001
RewriteRule (.*) http://www.domain1.com/$1 [R=301,L]
我是否也应该出于 SEO 的目的而实施这个?我是否也应该为我的其他 IP 地址实现此功能?
这么多问题...
当然,如果您有任何其他建议,请分享您的意见!
【问题讨论】:
-
如果表中的两个 URL 相同,您希望第四次重定向是什么?对于案例 1,是否有重定向?您可能有其他虚拟主机。每个 ip:port 组合列出的第一个是包罗万象的,我在任何地方都看不到 test1.domain.com。也许包括 apachectl -S 输出?
标签: redirect ssl dns apache2 virtualhost