httpd 上的虚拟主机无意中重定向

Virtual host on httpd redirect unintentionally

我的目标

运行 2 名虚拟主机,1 个 IP。例如,front1.httpd.example.comfront2.httpd.example.com 在 1 个服务器的 1 个 httpd(父)进程上是可访问的(我想在 front1 和 front2 的端口 80 上监听)。

环境

httpd 2.4 和 Ubuntu11(32 位)

我做了什么

我根据最新的官方文档Name-based Virtual Host Support在httpd.conf上添加了两个虚拟主机。

我还像下面这样更新我的服务器 /etc/hosts 和客户端主机。

服务器的主机(220.xxx.xxx.xxx是一些实际IP)

127.0.0.1 front1.httpd.example.com front2.httpd.example.com localhost

220.xxx.xxx.xxx front1.httpd.example.com
222.xxx.xxx.xxx front2.httpd.example.com

客户的主机

220.xxx.xxx.xxx front1.httpd.example.com
220.xxx.xxx.xxx front2.httpd.example.com

此外,我的主机名是 front1.httpd.example.com

(注意:我也尝试在 VirtualHost 部分之前添加 NameVirtualHost *:80,但它只是 return 的附加消息 "NameVirtualHost has no effect...")

结果

当我访问 front1.httpd.example.com/index.html 时,htdocs/xxxx/index.html 被 return 编辑。这是我所期望的,但是当我访问 front2.httpd.example.com/index.html 时,htdocs/xxxx/index.html 也被 return 编辑,尽管我打算显示 htdocs/yyyy/index.html。 (在浏览器控制台消息中,找到 front2.httpd.example.com/index.html 然后 302 重定向到 front1.httpd.example.com/index.html

虚拟主机将return第一个虚拟主机值,如果没有匹配结果访问。所以,我也尝试像下面这样更改虚拟主机的顺序:

第一次尝试:

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/xxxx"
    ServerName front1.httpd.example.com
    ServerAlias front1.httpd.example.com
    ErrorLog "logs/dummy-host1.example.com-error_log"

    <Directory "/opt/APACHE/httpd/htdocs/xxxx">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/yyyy"
    ServerName front2.httpd.example.com
    ServerAlias front2.httpd.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    <Directory "/opt/APACHE/httpd/htdocs/yyyy">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

第二次尝试:

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/yyyy"
    ServerName front2.httpd.example.com
    ServerAlias front2.httpd.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    <Directory "/opt/APACHE/httpd/htdocs/yyyy">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/xxxx"
    ServerName front1.httpd.example.com
    ServerAlias front1.httpd.example.com
    ErrorLog "logs/dummy-host1.example.com-error_log"

    <Directory "/opt/APACHE/httpd/htdocs/xxxx">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

因此,front2.httpd.example.com/index.htmlreturns htdocs/yyyy/index.html,但front1.httpd.example.com/index.html也returns htdocs/yyyy/index.html。因此,我想访问请求并没有太多虚拟主机。

参考和评论

我检查了类似的问题 ,但就我而言,我在服务器和客户端都写了主机文件,所以我认为 DNS 不适合我。

我在过去几年设置了 httpd 服务器,并且还使用了 VirtualHost 和旧东西 NameVirtualHost,但是这次我搞砸了或者我不知道。 请给我任何想法?

我的httpd.conf

ServerRoot "/opt/APACHE/httpd"

Listen 80

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/xxxx"
    ServerName front1.httpd.example.com
    ServerAlias front1.httpd.example.com
    ErrorLog "logs/dummy-host1.example.com-error_log"

    <Directory "/opt/APACHE/httpd/htdocs/xxxx">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/yyyy"
    ServerName front2.httpd.example.com
    ServerAlias front2.httpd.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    <Directory "/opt/APACHE/httpd/htdocs/yyyy">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

<IfModule unixd_module>
User ubuntu
Group ubuntu
</IfModule>

<Directory />
    AllowOverride none
    Require all denied
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" common

</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/opt/APACHE/httpd/cgi-bin/"
</IfModule>

<IfModule cgid_module>
</IfModule>

<Directory "/opt/APACHE/httpd/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig conf/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule> 

我在此服务器实例上使用 OpenAM Web 策略代理。

因此,只需将每个 FQDN 添加到 OpenAm 代理配置文件上的 FQDN 虚拟映射即可达到我的目标。