我正在尝试将多个主机名重定向到一个,例如,如果您输入以下任何一个:
foo.example.com
www.example.com
bar.example.com
eample.com
Run Code Online (Sandbox Code Playgroud)
你必须被重定向到 www.example.com
我已经安装了一个www.example.com作为 ServerName的虚拟主机,其他的作为 ServerAlias,并使用 mod_rewrite 检查主机名是否正确,如果不正确则进行重定向。
问题是一切似乎都与 ServerName 指令主机名一起提供,所以 mod_rewrite 总是得到www.example.com,这与 apache2 文档一致:
例如,假设您正在为域 www.domain.tld 提供服务,并且您希望添加指向相同 IP 地址的虚拟主机 www.otherdomain.tld。然后您只需将以下内容添加到 httpd.conf:
名称虚拟主机 *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
<VirtualHost *:80>
服务器名称 www.otherdomain.tld
DocumentRoot /www/otherdomain您也可以指定显式 IP 地址来代替 NameVirtualHost 和指令中的 *。例如,您可能希望这样做是为了在一个 IP 地址上运行一些基于名称的虚拟主机,以及在另一个地址上运行基于 IP 或另一组基于名称的虚拟主机。
许多服务器希望通过多个名称进行访问。这可以通过放置在该部分内的 ServerAlias 指令实现。例如,在上面的第一个块中,ServerAlias 指令指示列出的名称是人们可以用来查看同一网站的其他名称:
ServerAlias domain.tld *.domain.tld 然后对 domain.tld 域中所有主机的请求将由 www.domain.tld 虚拟主机提供服务。
是否有任何 apache2 指令来避免此功能并使用它们匹配的 ServerAlias 的主机名获取请求服务器?
或者我必须为重定向创建另一个虚拟主机?
谢谢
我在我的 apache2 conf 文件中添加了 2 个虚拟主机,如下所示:
<VirtualHost *:80>
DocumentRoot /var/www/html/site1
ServerName www.site1.com
ServerAlias site1.com
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/html/site2
ServerName www.site2.com
ServerAlias site2.com
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
然后我在重新启动 apache 后得到错误:
[warn]默认VirtualHost 在 80 端口重叠,第一个优先
搜索谷歌,他们说要取消注释下面的行,所以我做了:
NameVirtualHost *:80
Run Code Online (Sandbox Code Playgroud)
重新启动,现在我没有收到错误消息,但是两个站点都转到第一个站点。
运行 Centos5。我该如何解决这个问题?
我正在尝试设置一个 apache-ubuntu-php 网络服务器。我的网络服务器将托管多个 SSL 站点,每个 SSL 站点都有自己的 IP 地址(除非有更好的方法来做到这一点)。
所以我想第一步是让 apache 识别至少两个不同的 IP 地址。现在,我有一个网站的 SSL 和非 SSL 版本,分别是http://mysite.com和https://mysite.com。尽管两者目前都在我的服务器上运行,但我无法让两者都使用不同的 IP 地址。现在,两者都使用 IP 1.1.1.1。我购买了第二个 IP 地址 2.2.2.2,但https://mysite.com不接受它,firefox 抱怨错误“ssl_error_rx_record_too_long”。这是我的 2 个 vhost 文件
/etc/apache2/site-enabled/000-default
#NameVirtualHost 1.1.1.1:80
#<VirtualHost 1.1.1.1:80>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order …Run Code Online (Sandbox Code Playgroud) 好的,所以我有一个使用以下指令设置的 Apache 服务器:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example1.com
ServerAlias www.example1.com
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
ServerName example2.com
ServerAlias *.example2.com
DocumentRoot /var/www/example2
</VirtualHost>
<VirtualHost example1.com:443>
DocumentRoot /var/www/html
ServerName example1.com:443
SSLEngine on
...
</VirtualHosts>
Run Code Online (Sandbox Code Playgroud)
因此 example1.com 支持 SSL,可以通过 http://example1.com 或 https://example1.com 访问。但是,当我在浏览器中访问 https://example2.com 时,这会产生意外的副作用,即显示 https://example1.com。我想要做的基本上是以某种方式禁用 https://example2.com 或将其重定向到 http://example2.com,这样我在访问它时就不会收到警告和错误的站点。
我正在处理多虚拟主机环境。我已经为 Mysql 远程控制安装了 PhpMyadmin。
环境配置如下:
one.domain.com
two.domain.com
onlyphpmyadmin.domain.com
Run Code Online (Sandbox Code Playgroud)
现在,如果我访问三个域之一
http://one.domain.com/phpmyadmin/
http://two.domein.com/phpmyadmin/
http://onlyphpmyadmin.domain.com/phpmyadmin/
Run Code Online (Sandbox Code Playgroud)
结果是一样的,允许访问phpmyadmin。
目标是获得如下所示的情况
http://one.domain.com/phpmyadmin/ --> access denied
http://two.domein.com/phpmyadmin/ --> access denied
http://onlyphpmyadmin.domain.com/phpmyadmin/ -->access allowed
Run Code Online (Sandbox Code Playgroud)
没有类似于
<?php
if($_SERVER['HTTP_HOST'] != 'onlyphpmyadmin.domain.com')
die('access denied');
...
?>
Run Code Online (Sandbox Code Playgroud)
在一些 phpmyadmin 文件上。
这是我的 phpmyadmin 配置文件
Alias /phpmyadmin /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_flag register_globals Off
php_admin_flag allow_url_fopen Off
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/
</IfModule>
</Directory>
# Authorize for …Run Code Online (Sandbox Code Playgroud) 对于我的 NGINX 服务器,我设置了一个虚拟服务器来分发静态内容。目前我正在尝试设置它以便图像具有到期日期。但是,当我为此创建一个位置指令时,一切都会导致 404。
我现在的配置是这样的:
/srv/www/static.conf
server {
listen 80;
server_name static.*.*;
location / {
root /srv/www/static;
deny all;
}
location /images {
expires 1y;
log_not_found off;
root /srv/www/static/images;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此文件包含在 /etc/nginx/nginx.conf 中的 http 指令中
我试图访问图像,在,让我们说...... static.example.com/images/screenshots/something.png。果然,图像也存在于/srv/www/static/images/screenshots/something.png。但是,转到上述地址不起作用,只是告诉我404 Not Found。
但是,如果我删除location /images并更改location /为以下内容...
location / {
root /srv/www/static;
}
Run Code Online (Sandbox Code Playgroud)
有用!我在这里做错了什么?
我在 nginx 上设置了 2 个网站,应该根据访问的域加载正确的网站。
例如: website1.com website2.com
但是,在访问这两个域中的任何一个时,它们都会加载 website1.com。
我的配置有什么问题?两个配置都在启用站点的单独文件中
website1.com 配置
server {
listen 80;
listen [::]:80 ipv6only=on;
root /var/www/website1.com;
index index.php index.html index.htm;
# Make site accessible from http://localhost/
server_name website1.com;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.php?$query_string;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ \.php$ {
try_files $uri /index.php =404; …Run Code Online (Sandbox Code Playgroud) 我们已经在 Ubuntu Trusty 上运行了 nginx。它通过 https 为多个网站提供服务,运行在一个 IP 地址上。
随机地,虽然它似乎与工作负载略有关系,但有时单个请求会出现在错误的虚拟主机上。这导致请求lustrum.thalia.nu被服务,thalia.nu反之亦然。当用户突然进入不同的网站时,这会产生令人讨厌的错误页面。当您按下 时F5,用户将再次到达原始目标。
它似乎与浏览器或操作系统无关。已确认在 Firefox(Linux、Windows、Mac)、Edge(Windows)和 Chrome(Linux、Windows、Android)和 Safari(iOS)上发生。
当系统处于负载状态时,该问题似乎更频繁地发生,这表明存在某种竞争条件。
server {
server_name lustrum.thalia.nu;
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/certs/lustrum.thalia.nu.crt;
ssl_certificate_key /etc/nginx/certs/lustrum.thalia.nu.key;
add_header Strict-Transport-Security "max-age=63072000; preload";
root /var/www/thalia-lustrum/public_html;
location / {
index index.php;
try_files $uri $uri/ /index.php?$args;
}
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
include /etc/nginx/fastcgi_params;
fastcgi_split_path_info ^(.+?\.php)(/.*)$; …Run Code Online (Sandbox Code Playgroud) 我在 Mac OS X 上运行 Apache 2.4。apachectl configtest给我:语法确定。
我设置了两个虚拟主机,一个叫做 localhost,一个叫做 test.dev。
<VirtualHost *:80>
DocumentRoot "/Users/psychomachine/Development/_localhost"
ServerName localhost
ServerAlias www.localhost
<Directory />
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/Users/psychomachine/Development/test"
ServerName test.dev
ServerAlias www.test.dev
<Directory />
Require all granted
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
本地主机只是工作:
? curl -I -L localhost 15:51:08
HTTP/1.1 200 OK
Date: Tue, 08 Dec 2015 14:51:17 GMT
Server: Apache/2.4.16 (Unix)
Last-Modified: Tue, 08 Dec 2015 08:52:04 GMT
ETag: "c-5265f1673f500"
Accept-Ranges: bytes
Content-Length: 12
Content-Type: text/html
Run Code Online (Sandbox Code Playgroud)
而 test.dev …
我有运行多个虚拟主机的 Web 服务器,我想让窃听者不知道客户端正在访问哪个虚拟主机。已经有一个 TLS 扩展可以解决这个问题:加密 SNI。我看到 Cloudflare 在其服务器上支持它,并且 Firefox 有一个设置可以在客户端上启用它。但是,我找不到有关如何在我自己的服务器上启用此功能的任何文档。我该怎么做呢?(我不依赖于任何特定的服务器堆栈,除了“将其置于 Cloudflare 之后”之外,我将接受任何工作设置/架构。)
virtualhost ×10
apache-2.2 ×5
nginx ×3
ssl ×3
php-fpm ×2
centos ×1
mac-osx ×1
php ×1
redirection ×1
serveralias ×1
tls ×1
ubuntu ×1
web-server ×1