apache的虚拟域名rewrite配置以及.htaccess的使用。
在web服务器领域,Apache基本上是一统天下的,虽然现在越来越多的人转向nginx的,但是仍然由于apache的高性能以及强大的功能,还是大多数服务器在使用Apache。
apache的安装就先不说了。今天主要来说Apache的虚拟域名功能以及对应的rewrite配置
配置虚拟域名
啥是虚拟主机呢?就是说把你自己的本地的开发的机子变成一个虚拟域名,比如:你在开发pptv下面的一个项目 127.0.0.1/pptv_trunk,你想把自己的机器域名变成www.pptv.com。那么你自己的机器访问方式就成为了一个虚拟域名。
虚拟域名的好处:
虚拟域名的好处就是可以模拟线上的域名,无缝切换测试环境和线上环境,使他们保持统一,更有利于开发和测试。
如何配置呢。一步步来:
1 . 打开apache的配置文件 htppd.cnf。分别打开重写扩展和虚拟主机扩展:
LoadModule rewrite_module modules/mod_rewrite.so 这句前面的 注释 # 去掉
Include conf/extra/httpd-vhosts.conf 这句前面的 注释 # 去掉
2 . 配置下这个 httpd-vhosts.conf 文件,这个文件就在当前httpd.conf配置文件所在的目录的子目录/extra/下,window和linux 差不多稍有不同
文件里面有几个例子,我们先搞一个,其实很简单。
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "D:/wamp/www/pptv_trunk"
ServerName www.pptv.com
<Directory "D:/wamp/www/pptv_trunk>
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
好,这样一个虚拟域名在Apache上就配置好了。
3 . 打开windows/Linux的hosts配置文件,这个文件是系统的dns路由文件:
windows 在 C:\Windows\System32\drivers\etc\ 目录下
linux 在 /etc/hosts\ 目录下。
我们编辑一下,绑定刚才的pptv项目,加上这条:
127.0.0.1 pptv.com www.pptv.com
4 . 打开浏览器访问 www.pptv.com 那么就会定位到刚才的 D:/wamp/www/pptv_trunk
项目了。和本地开发一模一样。
5 . 如果想切换到其他的环境,只需要修改hosts
文件就可以了:
内侧环境 192.168.100.104 www.pptv.com pptv.com
预发布环境 112.123.132.33 www.pptv.com pptv.com
生产线上就用#注释掉,不需要绑定,就切换到线上环境了。
虚拟域名VirtualHost配置详解
什么是rewrite? 就是重写,重写访问的url连接,有时候为了访问的url简洁点,比如:
www.pptv.com/i/?user_id=123&time=123&from=web
我觉得这个地址太长了不够简洁,就可以依靠apache的虚拟域名规则把它写的简单一点:
www.pptv.com/i/123/123/web
看这样是不是舒服多了也更加简洁。
那么如何配置呢?还是得回到咱们刚才的 httpd-vhosts.conf 这个文件,所有的配置都在这个文件当中来完成。
在学习rewrite之前,我们先详细看一下一个Virtuhost的详细配置解读。
我们还是打开刚的一个虚拟域名,我们对着这个讲述,如何配置rewirite
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "D:/wamp/www/testphp/"
ServerName php.iyangyi.com
ServerAlias www.pptv.cn #可省略
ServerAdmin stefan321@qq.com #可省略
ErrorLog logs/dev-error.log #可省略
CustomLog logs/dev-access.log common #可省略
ErrorDocument 404 logs/404.html #可省略
<Directory "D:/wamp/www/testphp/">
Options Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</Directory>
</VirtualHost>
我们一个一个的说下如何配置。
1 . 首先需要申明虚拟域名包块
,采用xml风格,开始和结束符号对应。*.80
表示接受任何ip的80端口,一般是这样写,不改。
<VirtualHost *:80>
***
</VirtualHost>
2 . 进去之后,就是申明DocumentRoot
这是表示:项目代码的路径
。填入我们这个项目的代码所在的根目录
D:/wamp/www/testphp/
就可以了。
3 . ServerName
这个是我们的虚拟域名,也是这次修改的关键。
4 . ServerAlias
这个是我们的虚拟域名的别名,可以不要,他的出现场景就是我们希望另外一个域名也往这个目录下调整。比如 www.pptv.cn 我们也希望跳到这里来,就可以这样做,但是前提是 www.pptv.cn 也要绑定host 127.0.0.1
5 . ServerAdmin
这里填 服务器管理员的邮箱,也可以不要,当服务器出现故障后,如果提前有配置邮箱的话,会往这个邮箱发邮件,或者是显示在网页的错误信息当中。一般我们可以不填。
6 . ErrorLog
这里填 错误日志显示路径,当访问出现错误的时候,就会记录到这里,注意:logs/dev-error.log 这个文件路径是apache的安装目录下的logs 目录 。可以不要。
比如我们访问 http://php.iyangyi.com/f.html 时候, f.html是不存在的一个文件,那么这次就会被记录下来了。
在apache/logs/dev-error.log 中记录下来了:
[Wed Mar 11 11:14:23 2015] [error] [client 127.0.0.1] File does not exist: D:/wamp/www/testphp/f.html
7 . CustomLog
这里填 访问日志,用来记录每一次的请求访问,可以不要。注意:logs/dev-access.log 这个文件路径是apache的安装目录下的logs 目录 。记住:路径后面加common
。
比如我们访问 http://php.iyangyi.com/f.html 时候
在apache/logs/dev-access.log 中记录下来了这次的访问:
127.0.0.1 - - [11/Mar/2015:11:14:23 +0800] "GET /f.html HTTP/1.1" 404 177
8 . ErrorDocument
这里填 403,404等错误信息调整页面,用来访问出现404页面等情况时的错误页面展示,比较有用,也可以不要。注意:/404.html 这个文件路径是项目的根目录,不是apache的目录 。
我这里放到了D:/wamp/www/testphp/404.html 这里,所以,我们访问一个不存在的文件时,就会自动跳转到这个404.html页面了。
比如我们访问 http://php.iyangyi.com/f.html 时候,就会显示404.html的内容:
404.html 的内容:
404啊这是没找到页面啊傻逼
所以,我们可以根据业务需要把常用的状态码都给用上:
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 405 /405.html
ErrorDocument 500 /500.html
ErrorDocument 503 /503.html
9 . <Directory "D:/wamp/www/testphp/"> ***** </Directory>
这个是最重要的一步了,这里也是填本项目的路径,然后所有的rewrite
规则都是在里面完成。所以这个是很重要的。
10 . 我们进入到<Directory>
层次中,这里面很多都是很关键的。我们主要看一些常用的,也是很关键的。Options Indexes FollowSymLinks
这是来设置 是否来显示文件根目录的目录列表
的。
设置成:Options Indexes FollowSymLinks
就表示:我访问php.iyangyi.com,如果文件根目录里有 index.html(index.php),浏览器就会显示 index.html的内容,如果没有 index.html,浏览器就会显示这文件根目录的目录列表,目录列表包括文件根目录下的文件和子目录。
到底是优先显示index.php还是index.html 有apache的配置决定的:
<IfModule dir_module>
DirectoryIndex index.html index.htm index.php index.php3
</IfModule>
哪个在前面,目录下如果有这个文件,就优先显示哪个。
如果我不想让别人访问我的目录结构咋搞? ,可以将这个Indexs
去掉,或者这样:-Index
就可以啦。
变成:Options FollowSymLinks
或者 Options -Indexes FollowSymLinks
再次访问 php.iyangyi.com ,我们把index.php和index.html删掉了,刷新浏览器,就会显示:
Forbidden
You don't have permission to access / on this server.
11 . AllowOverride All
这个是干嘛的呢?其他教材说的很复杂,我们说简单点,就是允许根目录下的.htaccess
起rewrite作用,下面会说到的,我们在根目录下放一个.htaccess
文件,也是可以起到url rewrite作用的。
如果想禁止掉这个根目录下的.htaccess
文件,就可以这样: AllowOverride None
就可以了。
12 . Order Deny,Allow Allow from all
这2个一般是组合在一起用。用来设置访问权限
,设置哪些ip可以访问这个域名, 哪些ip禁止访问。
所以order是设置这2个的组合排序, 不区分大小写,中间用,
分开,中间不能有空格。 Order Deny,Allow
:表示设定“先检查禁止设定,没有设定禁止的全部允许”
Order Allow,Deny
: 表示设定“先检查允许设定,没有设定允许的全部禁止”
而且最后的访问结果有第二参数决定!
Deny from All
Deny from 127.0.0.1
禁止访问的ip, all 表示全部 Allow from All
Allow from 127.0.0.1
允许访问的ip, all 表示全部
我们看几个他们2个组合的例子。
这个例子:
Order Deny,Allow
Deny from All
表示先检查允许的, 没有允许的全部禁止。但是下却没有Allow,那么就表示是无条件禁止了所有的访问了。
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
上面表示 只允许127.0.0.1访问
Order Allow,Deny
Allow from all
Deny from 127.0.0.1 192.168.1.51
上面表示禁止127.0.0.1和192.168.1.51访问,其他都可以!
所以这个的组合就可以达到很多的过滤访问效果。
RewriteCond 与 RewriteRule 指令格式配置详解
上面花了大量的时间讲述VirtualHost
里面的一些配置参数的写法和作用,接下来就是rewrite的重点了,3个核心的东西:RewriteEngine,RewriteCond,RewriteRule
RewriteEngine
这个是rewrite的总开关
,用来开启是否启动url rewrite,要想打开,像这样就可以了:
RewriteEngine on
RewriteCond 和 RewriteRule
表示指令定义和匹配一个规则条件,让RewriteRule来重写。说的简单点,RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能。
先看个例子:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.*
RewriteRule index.php index.m.php
上面的匹配规则就是:如果匹配到http请求中HTTP_USER_AGENT 是 Mozilla//5/.0.* 开头的,也就是用FireFox浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件。
RewriteCond 和 RewriteRule 是上下对应的关系。可以有1个或者好几个RewriteCond来匹配一个RewriteRule
RewriteCond一般是这样使用的
RewriteCond %{XXXXXXX} + 正则匹配条件
那么RewriteCond可以匹配什么样的数据请求呢?
它的使用方式是:RewriteCond %{NAME_OF_VARIABLE} REGX
FLAG
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.*
RewriteCond %{REQUEST_FILENAME} !-f
上面是常见的3种最常见使用最多的HTTP头连接与请求
匹配。
HTTP_REFERER
这个匹配访问者的地址,php中$_REQUREST中也有这个,当我们需要判断或者限制访问的来源的时候,就可以用它。
比如:
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php
上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。
再比如,也可以利用 HTTP_REFERER 防倒链
,就是限制别人网站使用我网站的图片。
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !ww.iyangyi.com [NC]
RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]
NC nocase的意思,忽略大小写。第一句呢,是必须要有域名,第一句就是看域名如果不是 www.iyangyi.com 的,当访问.jpg或者.gif文件时候,就都会自动跳转到 http://image.baidu.com/ 上,很好的达到了防盗链的要求。
REQUEST_FILENAME
这个基本是用的最多的,以为url重写是用的最多的,它是匹配当前访问的域名文件,那哪一块属于REQUEST_FILENAME 呢?是url 除了host域名外的。
http://www.rainleaves.com/html/1569.html?replytocom=265
这个url,那么 REQUEST_FILENAME 就是 html/1569.html?replytocom=265
看个例子:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]
-d
是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d
-f
是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f
这两句语句RewriteCond
的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径。一般是这样结合在一起用的。
上面RewriteRule
正则的意思是以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123
$1
表示匹配到的第一个参数。
RewriteRule 写法和规则
RewriteRule是配合RewriteCond一起使用,可以说,RewriteRule是RewriteCond成功匹配后的执行结果,所以,它是很重要的。
来看一下 RewriteRule
的写法:
RewriteRule Pattern Substitution [flags]
Pattern
是一个正则匹配。Substitution
是匹配的替换 [flags]
是一些参数限制;
我们看几个例子:
RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]
意思是 以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123
RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]
意思是以为是访问.jpg或者gif的文件,都会调整到 http://image.baidu.com
所以,掌握正则级是关键所在了。以后,我会专门搞一个正则的篇章来学习下。
我们再看看[flags]
是什么意思?
因为它太多了。我就挑几个最常用的来说说吧。
[QSA]
qsappend(追加查询字符串)的意思,次标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。上面那个room
的例子,就必须用它。
NC
nocase(忽略大小写)的意思,它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,"A-Z"和"a-z"没有区别。这个一般也会加上,因为我们的url本身就不区分大小写的。
R
redirect(强制重定向)的意思,适合匹配Patter后,Substitution是一个http地址url的情况,就调整出去了。上面那个调整到image.baidu.com的例子,就必须也用它。
L
last(结尾规则)的意思,就是已经匹配到了,就立即停止,不再匹配下面的Rule了,类似于编程语言中的break
语法,跳出去了。
其他的一些具体的语法,可以参考以下资料:
http://www.2cto.com/os/201201/116040.html
http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html
.htaccess文件的使用
.htaccess
文件是啥呢?我们前面说了这么多的配置和修改,都是针对于apache的配置文件来修改的。.htaccess文件就是它的一个替代品。为啥呢?因为你每次修改apache的配置文件,都必须重启apache服务器,很麻烦不说,有些共享apache的服务器,你还没权限修改和重启apache。所以,.htaccess文件就应运而生了。
.htaccess
分布式配置文件。它文件名字比较奇怪,没有文件名,只有一个文件后缀就是.htaccess
。所以一般在windows下还没法新建这个文件,因为windows不允许文件名是空的,比较蛋疼。但是我相信你总归会有办法新建这个文件的。
.htaccess
同时是一个针对目录的配置,你可以把它放到项目的根目录下,那么它就多整个项目其效果,如果你把它放到一个单独的子目录下,那么它就对这个子目录其效果了。
.htaccess文件如何生效呢。上面讲配置的时候,我讲过了AllowOverride All
这个配置,它就是启动.htaccess
文件是否可以使用的。AllowOverrideAll
表示可以。AllowOverride None
表示禁止使用。还是蛮简单的。
那.htaccess文件里的语法是怎么写额呢?
其实和上面说的一模一样的写法。可以完全的搬过来用。没问题。
<Directory "D:/wamp/www/testphp/">
Options Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</Directory>
上面的apache的<Directory>
里的这一块就可以完全的搬到.htaccess
文件中来,且效果一模一样。
原文:https://www.zybuluo.com/phper/note/73726
apache的虚拟域名rewrite配置以及.htaccess的使用。的更多相关文章
- apache下虚拟域名配置
在我们开发中通过虚拟域名来访问一个指定的项目确实很方便,接下来教大家如何通过手动的方式去配置虚拟域名(已apache服务器为例) 一.首页我们得找到host文件.windows下这个文件在c盘中WIN ...
- apache中虚拟主机的配置
一.两种方式:基于域名的虚拟主机和基于IP地址的的虚拟主机 (这里基于前者) 二.作用:实现在同一个web服务器下,同时运行很多个站点(项目) 三.虚拟主机的配置 1.在核心配置文件中加载虚拟主机配置 ...
- PHP的虚拟域名的配置
由于本人的自己搭建的php环境,Wamp环境.虚拟域名是写程序的一个最基本的配置,也对项目的调试有一定的真实感.我在学习虚拟域名的时候是受到了一些的问题,所以说写这个是为了帮助新人少走弯路, 也是为了 ...
- IIS、nginx、apache只允许域名访问配置
您开启WAF后,攻击者只能看到WAF的IP,不能看到您的IP,攻击者通过域名访问您的网站时,就会根据规则拦截. 但是如果您的网站可以输入IP地址直接访问,是无法达到防御效果的.比如(http://42 ...
- ubuntu下的apache的虚拟主机的配置
ubuntu下的虚拟主机的配置相对window下的虚拟主机配置有些许不同. 对于要新建的虚拟主机,我们可以有如下几个步骤: 1.在/etc/apache2/sites-available/目录下新建一 ...
- Web服务器(Apache)虚拟主机的配置
一.定义 所谓虚拟主机是指在一台服务器里运行几个网站,提供WEB.FTP.Mail等服务. 二.虚拟主机的实现方法有三种: 基于IP的方法,基于主机名的方法和基于端口的法官法. ...
- apache的虚拟目录的配置
第一步:在httpd.conf底部添加以下代码.表示添加虚拟目录 1 <IfModule dir_module> #direcotory相当于是欢迎页面 DirectoryIndex in ...
- 《Apache之虚拟主机的配置》——RHEL6.3
1.安装httpd软件包: Yum install httpd 2.启动apache服务: [root@redhat Desktop]# /etc/init.d/httpd start Startin ...
- nginx虚拟域名的配置以及测试验证
1.保证该机器上安装了nginx 未安装请看:centos/linux下的安装Nginx 2.使用root用户编辑配置文件 vim /usr/local/nginx/conf/nginx.conf 3 ...
随机推荐
- JVM探究之 —— HotSpot虚拟机对象探秘
本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1. 对象的创建 Java是一门面向对象的编程语言.在语言层面 ...
- 网络公开课和MOOC资源
美国(USA) 1. 麻省理工学院开放课程(Free Online Course Materials/ MIT OpenCourseWare) 2. 耶鲁大学开放课程(Online Video Lec ...
- ajax发送json数据时为什么需要设置contentType: "application/json”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?contentType: "application/js ...
- python爬虫案例:使用XPath爬网页图片
用XPath来做一个简单的爬虫,尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地. # -*- coding:utf-8 -*- import urllib import ...
- 【翻译】Flink Table Api & SQL —Streaming 概念 —— 查询配置
本文翻译自官网:Query Configuration https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/s ...
- sigaction和实时信号sigqueue
sigaction函数sigaction函数的功能是用于改变进程接收到特定信号后的行为.int sigaction(int signum, const struct sigaction *act,st ...
- haproxy2.0入门部署教程
测试后发现,haproxy2.0和之前的版本部署有些许差异,配置文件的写法也是不同的 测试环境:Centos7.3 IP:172.16.1.227 172.16.1.228 部署httpd,页面内容为 ...
- [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项 II
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- .Net Core 1.1打包发布到Linux
在 .Net Core 1.0 中我们打包跨平台包是在 project.json 中配置的 但是 .Net Core 1.1 去掉了 project.json 具体咋办参考:https://blogs ...
- php_mvc实现步骤五
5.match_controller 控制器层典型实现 控制器类 依据功能的相关性,将一系列相关的功能,使用一个控制器类来处理,而该控制器的每个方法,就对因某个功能. 注意:控制器是按照功能划分的.( ...