您好,匿名用户
随意问技术百科期待您的加入

用 apache rewrite 和 php 实现单一入口时候出现的一个问题

0 投票

我想用 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.htm
</Directory>
用户头像 提问 2013年 10月27日 @ Gangplank 上等兵 (314 威望)
分享到:

1个回答

0 投票
 
最佳答案

你的规则有问题。

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>
用户头像 回复 2013年 10月4日 @ Thresh 上等兵 (138 威望)
选中 2013年 9月7日 @Gangplank
提一个问题:

相关问题

+1 投票
1 回复 101 阅读
0 投票
1 回复 28 阅读
0 投票
1 回复 36 阅读
用户头像 提问 2013年 10月31日 @ Cancer 上等兵 (211 威望)
0 投票
1 回复 62 阅读
用户头像 提问 2013年 9月18日 @ Darius 上等兵 (331 威望)
0 投票
1 回复 44 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...