httpd 上的虚拟主机无意中重定向
Virtual host on httpd redirect unintentionally
我的目标
运行 2 名虚拟主机,1 个 IP。例如,front1.httpd.example.com
和 front2.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.html
returns 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 虚拟映射即可达到我的目标。
我的目标
运行 2 名虚拟主机,1 个 IP。例如,front1.httpd.example.com
和 front2.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.html
returns htdocs/yyyy/index.html
,但front1.httpd.example.com/index.html
也returns htdocs/yyyy/index.html
。因此,我想访问请求并没有太多虚拟主机。
参考和评论
我检查了类似的问题
我在过去几年设置了 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 虚拟映射即可达到我的目标。