apache rewrite配置

来源:互联网 发布:飞鱼网络电视1.3.9 编辑:程序博客网 时间:2024/05/16 04:26

前言

今天将手头的ubuntu12.04 upgrade to ubuntu14.04,发现apache2.2 也自动升级到了apache2.4,然后之前的一个website的rewrite规则就不好用了。于是,从官网上找了点资料,然后自己反复测试,终于再次run起来了,并对rewrite中需要注意的细节有了一些心得。

新语法

在Apache2.4中,以前的Order 和Allow Deny指令已经取消了,改成了Require。Require的语法最常用的方式就是

Require all granted/denied<RequireAll>Require all grantedRequire not ip 192.168.2.*Require not host example.com</RequreAll>

RequireAll从名字上可以理解,就是需要里面的所有的auth都要满足,和以前的Satisfy用法类似

<RequireAny> 

RequireAny就是只要有任何一个RequireAny中包含的auth项满足,就满足。

<RequireNone>

RequireNone就是需要包含在RequireNone中任何一个项都不满足才通过。

错误解决

说明:最开是我升级后,重新配置了website的监听端口以及DocumentRoot,然后访问localhost:port发现直接给出

ForbiddenYou don't have permission to access /xxx.html on this server.

因为我的website之前就是在当前用户的/home/user/目录,权限一般是700是不让其他用户(apache内置默认的Daemon用户)访问的,于是在/etc/apache2/apache.conf文件中找到设置${APACHE_RUN_USER}和${APACHE_RUN_GROUP}的地方,设置User 当前用户 ,Group 当前用户,restart Apache,本以为就此完事,发现仍然提示之前的Forbiden错误。

反复思考是不是路径不对,但仔细核对发现并没有错。后面在网上google了一番,找到有人问同样的问题,上面提示说是根目录默认是denied的,于是gvim打开/etc/apache2/apache2.conf仔细核查,发现如下配置信息:

<Directory />Options FollowSymLinksAllowOverride NoneRequire all denied</Directory><Directory /usr/share>AllowOverride NoneRequire all granted</Directory><Directory /var/www/>Options Indexes FollowSymLinksAllowOverride NoneRequire all granted</Directory>
原来如此,确实apache默认设置了根目录是不可访问的,但是我不是设置了自己的website的DocumentRoot目录是可访问的吗??

这个疑问困扰了半天,直到突然发现在sites-enabled/000-default.conf中才发现

上面的apache2.conf配置的是/var/www目录,而000-default.conf里面配置的是/var/www/html目录,难道是说配置某个目录只代表该目录下面的文件可以访问??

于是在自己的website对应的VirtualHost里面增加

<Directory /home/xxx/workspace/php_web/abc>    Options -Indexes +FollowSymLinks    AllowOverride None    Require all granted</Directory>
<Directory <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">/home/xxx/workspace/php_web/abc/website</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">></span>    RewriteEngine on    RewriteCond %{REQUEST_URI} ^([^./]+)$    RewriteRule ^.*$ index.php/%1 [L]    RewriteCond %{REQUEST_URI} ^([^./]+)/([^./]+)$    RewriteRule ^.*$ index.php/%1/%2 [L]    DirectoryIndex index.php index.html </Directory>

重启apache,然后访问,成功打开了主页。其实就是说如果要想让你的website可以访问根目录,必须要在它的父级目录或者祖先目录设置allow

高高兴兴,准备收工,随手点两个登陆发现,登陆失败。检查数据库没有问题。并且提示的是路径没有找到,直接推断应该是重写出了问题。看了几遍上面的重写规则配置,大体上没有问题,直觉感觉有可能是REQUEST_URI忽略了/导致的问题,于是加上去变成

<Directory /home/xxx/workspace/php_web/abc/website>    RewriteEngine on    RewriteCond %{REQUEST_URI} ^/([^./]+)$    RewriteRule ^.*$ index.php/%1 [L]    RewriteCond %{REQUEST_URI} ^/([^./]+)/([^./]+)$    RewriteRule ^.*$ index.php/%1/%2 [L]    DirectoryIndex index.php index.html </Directory>
重启Apache,OK!

总结

一、apache access设置必须要设置website的父级目录或者祖先目录才能使DocumentRoot目录被直接访问
二、REQUEST_URI 包括了路径最开始的/



0 0
原创粉丝点击