标签 Apache 下的文章

Thumb

使用伪静态后,PHP无法使用$_SERVER['SERVER_PORT']获取真实端口

今天无意间遇到这么个问题,就是在使用伪静态后,$_SERVER['SERVER_PORT']无法获取到服务器真实的端口。起先以为是程序问题,但是后来关了程序的伪静态功能后,发现又能正确获取到端口,所以就写了个简单的测试脚本。

在localhost根目录下建个 index.php 文件,内容为:

同一目录下再建个 .htaccess 文件,内容为:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^test$ /index.php
</IfModule>
server_port-1
图1

测试环境:XAMPP 1.7.3 (Apache 2.2.14 + PHP 5.3.1)

测试结果如图1

询问了半天 Google 和百度两兄弟,都没结果,正郁闷之时,突然想起还有官方的帮助文档有很多人会留言,于是去看看。结果,不看不知道,这下子可让我发现新大陆了。原来官网文档(E文)上关于“SERVER_PORT”还有这样一段文字:

Note: Under the Apache 2, you must set UseCanonicalName = On, as well as UseCanonicalPhysicalPort = On in order to get the physical (real) port, otherwise, this value can be spoofed and it may or may not return the physical port value. It is not safe to rely on this value in security-dependent contexts. 
server_port-2
图2

大概意思是说:在 Apache2 下必须要将 UseCanonicalName 和 UseCanonicalPhysicalPort 都设置为 On 才能获取到真实的端口。

这下知道原因了,剩下的就是改 Apache 配置文件了。不过要说明下,配置文件里,可能只能找到 UseCanonicalName,而找不到 UseCanonicalPhysicalPort,当然这不需要担心,只要手动加上就可以了。注意,如果只改了 UseCanonicalName 而没有改 UseCanonicalPhysicalPort 的话,就连不使用伪静态都无法获取到真实端口的!

然后再运行上面测试脚本,结果就应该如图2所示。然后,就没有然后啦~~哈哈~

Thumb

Apache虚拟主机的六种配置方法

基于不同情况下配置Apache虚拟主机的方法,一共八种情况。首先查看你虚拟主机属于哪一种情况,然后对号入座就好了。过程不复杂,关键在于对症下药。

1、基于ip地址的虚拟主机

Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot /home/httpd/html1
ServerName www.ok1.com
ErrorLog /usr/local/apache/logs/error1_log
CustomLog /usr/local/apache/logs/access1_log combined
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /home/httpd/html2
ServerName www.ok2.com
ErrorLog /usr/local/apache/logs/error2_log
CustomLog /usr/local/apache/logs/access2_log combined
</VirtualHost>

2、基于IP 和多端口的虚拟主机配置

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot /www/example1-80
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example1-8080
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example1.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example2.org
</VirtualHost>

3、单个IP 地址的服务器上基于域名的虚拟主机配置

# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com
ServerAlias example1.com. *.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>

4、在多个IP 地址的服务器上配置基于域名的虚拟主机

Listen 80
# This is the "main" server running on 172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver
# This is the other address
NameVirtualHost 172.20.30.50
<VirtualHost 172.20.30.50>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here ...
</VirtualHost>

5、在不同的端口上运行不同的站点(基于多端口的服务器上配置基于域名的虚拟主机)

Listen 80
Listen 8080
NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080
<VirtualHost 172.20.30.40:80>
ServerName www.example1.com
DocumentRoot /www/domain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example1.com
DocumentRoot /www/domain-8080
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example2.org
DocumentRoot /www/otherdomain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example2.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>

6、基于域名和基于IP 的混合虚拟主机的配置

Listen 80
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example2
ServerName www.example2.org
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example3
ServerName www.example3.net
</VirtualHost>

 

原文:http://jingyan.baidu.com/article/363872ec870f6e6e4ba16feb.html

 

Thumb

Debian下安装Apache为系统服务

最近在Debian下安装AMP(Apache+MySQL+PHP)的环境,由于本人比较中意传统的linux安装方式,加之Apache本身的缘故,就遇到了Apache无法安装成系统服务,也无法自动启动的问题。

谷歌了许久,却找不到Debian下相关的方法,只有一些其他linux的安装方法,可是由于他们的目录结构不同,又无法直接拿来使用。因为Debian下rcX.d(X表示0-6的数字)目录是存放在/etc目录中的,而不像其他的是存在/etc/init.d目录下的。我们只需要按照对应的目录来操作即可。网上找到的命令如下:

cp /usr/local/apache2/bin/apachctl /etc/init.d/apache2
ln /etc/init.d/apache2 /etc/rc3.d/S18apache2

然而,执行上述上面的命令后,虽然可以使用 service apache start/stop/restart 来启动/关闭/重启Apache服务,但是服务器重启后,Apache仍然是无法自动启动的。后来经本人测试后发现,只要同时在其他的rcX.d目录中创建连接,问题即可解决。命令如下:

cp /usr/local/apache2/bin/apachctl /etc/init.d/apache2
ln /etc/init.d/apache2 /etc/rc2.d/S18apache2
ln /etc/init.d/apache2 /etc/rc3.d/S18apache2
ln /etc/init.d/apache2 /etc/rc4.d/S18apache2
ln /etc/init.d/apache2 /etc/rc5.d/S18apache2
ln /etc/init.d/apache2 /etc/rc0.d/K18apache2
ln /etc/init.d/apache2 /etc/rc1.d/K18apache2
ln /etc/init.d/apache2 /etc/rc6.d/K18apache2

需要注意的是:rc0.d、rc1.d、rc6.d三个目录中的是字母K开头的,其他的则是S开头的。至于数字18则是Apache的启动顺序,可以自行调整。

至此,问题得以圆满解决。然而对于用apt-get方式安装的Apache的朋友就没有这个烦恼了,因为它已经自动为你做了这些工作。