开发者社区> 问答> 正文

用 apache rewrite 和 php 实现单一入口出现的问题,求助。

我想用 Apache 的 rewrite 在 php 中实现单一入口,把所有的请求都重定向到 index.php,然后分析 $_SERVER['REQUEST_URI'],构建路由功能。
在使用时候时候出现了一个问题,请求其他的地址,比如 http://localhost/a/b/c 可以获得结果

array (size=4)
  0 => string '' (length=0)
  1 => string 'a' (length=1)
  2 => string 'b' (length=1)
  3 => string 'c' (length=1)

但是如果是 http://localhost/index 就会提示404错误,这是为什么啊
index.php大概是这样

<?php
........

function analysisUri() {
    var_dump(explode('/', $_SERVER['REQUEST_URI']));
}

echo $_SERVER['REQUEST_URI'];

analysisUri();
........

virtualhost配置是这样

这个rewrite规则是从网上找到的

DocumentRoot /home/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
    #AllowOverride All 

    <IfModule mod_rewrite.c>
        RewriteEngine on

        RewriteBase /
        #不显示index.php

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
        #RewriteRule ^(.*)$ index.php?$1 [QSA,L]
    </IfModule>
</Directory>
<Directory /home/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    #AllowOverride All 
    Order allow,deny
    allow from all

    DirectoryIndex index.php index.html index.html

展开
收起
落地花开啦 2016-06-13 10:39:50 2398 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    你的规则有问题。
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 行不通的,正确的应该是 RewriteRule ^(.*)$ index.php?$1 [QSA,PT,L]。? 才会吧后面的 $1 传给 index.php,而 / 告诉 apache 查找 index.php/ 目录下的 index 文件,自然是 404。
    你可以添加如下配置到 httpd.conf,调试 mod_rewrite,通过查看 rewrite.log 文件可以知道通过 rewrite 得到的路径到底是什么,完成调试后移除这个配置,否则会有些性能安全方面的影响。

    # 输出调试信息到 rewrite.log
    <IfModule mod_rewrite.c>
        RewriteLog "/var/log/apache2/rewrite.log"
        RewriteLogLevel 3
    </IfModule>

    http://httpd.apache.org/docs/2.2/mod/...

    另外,rewrite 规则完全没有必要写道 httpd.conf 里面,使用 .htaccess 比较好。
    httpd.conf

    DocumentRoot /home/www
    
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        #AllowOverride All 
    </Directory>
    
    <Directory /home/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        #AllowOverride All 
        Order allow,deny
        allow from all
    
        DirectoryIndex index.php index.html index.htm
    </Directory>
    
    /home/www/.htaccess
    
    <IfModule mod_rewrite.c>
            RewriteEngine on
    
            #不显示index.php
            RewriteBase /
    
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            
            RewriteRule ^(.*)$ index.php?$1 [QSA,PT,L]
    </IfModule>
    2019-07-17 19:35:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载

相关镜像