gpt4 book ai didi

redirect - 具有多个域的Apache虚拟主机

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:04 25 4
gpt4 key购买 nike

我试图弄清楚我的虚拟主机文件的最佳配置是什么,但是我遇到了一些问题。

目前,我有2个域:domain1.com和domain2.com

我有1个IP地址为000.000.000.001的服务器,它实际上托管所有需要的文件。在这些文件中,您有一个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地址实现此功能吗?

这么多的问题...

当然,如果您还有其他建议,请发表您的意见!

最佳答案

那里有很多问题!让我们尝试解决它们:


不知道您要问的是什么,不是CNAMES的专家,但会认为您至少需要“ * .domain1.com”,而不仅仅是“ *”
对于这两种失败,您都不会在ServerName或ServerAlias中明确记录备用服务器名称。在这种情况下,它将默认为配置中找到的第一个服务器。这是api.domain.com之一吗?如果是这样,则可以解释404,因为SERVER_NAME将(默认情况下)是由客户端提供的,因此api.domain1.com:80设置将仅重定向至其发送内容的https版本(这似乎正在发生) ,然后还会查看api.domain1.com:443配置,但找不到名称。您可能需要将替代名称添加到主domain1.com配置的ServerAlias设置中,或者将该配置移到第一个,以便它成为默认配置,并且仅在显式使用api.domain1.com名称时才使用api。 。
由于您似乎想直接将其重定向到新站点,因此我将更新DNS以指向您的新IP地址,以节省您购买两台服务器的费用(从金钱和管理时间方面)。可以在现有的DNS名称服务器上完成此操作以保留电子邮件,尽管将其合并在一起显然会更好。同时,在服务器配置中实施适当的301重定向,因为元重定向不会对搜索引擎发出强烈的信号,您似乎确实关心SEO。
主要方法是将http重定向到https。 HSTS主要是一项安全功能,可在浏览器发出请求之前自动将http重定向到https。这很有用,因为默认值是http(例如,默认情况下,在浏览器地址栏中键入www.example.com会将您发送到http://www.example.com而不是https://www.example.com),并且可以拦截该内容以防止升级到https (然后很难拦截)。不过,它有一些缺点:并非所有浏览器都支持它,您需要至少访问一次网站才能加载HSTS设置(尽管某些浏览器允许对此进行预加载),并且如果不访问该网站,则该设置将失效。 maxAge时间(再次假设未预加载)。因此,不应将其用作重定向的替代品,而应将其用作支持HSTS的浏览器的强制实施。如果您想了解更多有关HSTS的信息,请在here博客中找到。


我还要说的是,您有几种不同的重定向方法(api:80具有Rewrite,domain1:80具有Redirect,domain1:443具有Rewrite-但是具有非常严格的限制和不正确的RewriteCond)。就我个人而言,我更喜欢使用一种方法,因为它不那么混乱,但这是个人问题(重定向也稍微快一点,但是重写为您提供了更多功能,因此我更喜欢那种方法)。所以我倾向于这样配置:

<VirtualHost *:80>
#This is the first host so is the default.
#So although I've specified a ServerName and ServerAlias anything else not specified elsewhere will also end up here.
ServerName www.domain1.com
ServerAlias domain1.com

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

#Redirect everything to https:
RewriteEngine on
RewriteRule ^(.*)$ https://www.domain1.com$1 [R=301,L]
</VirtualHost>
<VirtualHost *:80>
ServerName api.domain1.com

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

#Redirect everything to https:
RewriteEngine on
RewriteRule ^(.*)$ https://api.domain1.com$1 [R=301,L]
</VirtualHost>


然后对于443,我将有以下内容:

<VirtualHost *:443>
#This is the first host so is the default.
#So although I've specified a ServerName and ServerAlias anything else not specified elsewhere will also end up here.
ServerName www.domain1.com
ServerAlias domain1.com

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

#Redirect everything which is not already on the real www domain name to that:
RewriteEngine on
RewriteCond %{HTTP_HOST} !www.domain1.com
RewriteRule ^(.*)$ https://www.domain1.com$1 [R=301,L]

#all your other 443 config for www.domain1.com

</VirtualHost>
<VirtualHost *:443>
ServerName api.domain1.com

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

#all your other 443 config for api.domain1.com

</VirtualHost>


请注意,我为每个虚拟主机添加了不同的日志文件,因此可以更清楚地看到哪个虚拟主机。

还要注意,我重定向的不是www.domain1.com,而是您的版本,只有当人们键入domain1.com时,您的版本才会重定向(并且我不确定会首先使用可疑api.domain1.com配置)。

这也将照顾任何通过IP地址或任何其他名称访问您的网站的人,因为它将始终重定向到您的真实www.domain1.com服务器名称。这对于http请求很容易,但是对于https请求,如果您的证书中不包含所使用的服务器名,则确实可能会收到证书错误。

LetsEncrypt不支持通配符,但是它们允许在证书上使用多个名称,因此您可以轻松获取domain1.com和www.domain1.com的证书,因此通常应将其视为最佳实践。您还可以添加您认为可能会使用的任何其他域。对于您的api.domain1.com域,您还可以添加到同一证书中,或为此获得单独的证书,因为您有单独的配置(您的上面的配置不清楚,因为它看起来像是在做什么)配置,但不确定这是否是错字)。

出于SEO的目的,确实最好只在一个URL下为您的网站提供服务,并使用重定向来强制执行该URL,而在上面的config中将执行此操作。如果您在www.domain1.com/page1.html和 https://www.domain1.com/page1.htmlhttps://domain1.com/page1.htmlhttp://000.000.000.001/page1.html ... etc下托管相同的内容,这可以防止Google认为您有重复的内容。

那里有很多内容,但希望可以为您指明正确的方向。

关于redirect - 具有多个域的Apache虚拟主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34455560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com