Heim >Backend-Entwicklung >PHP-Tutorial >url-rewrite - 用 apache rewrite 和 php 实现单一入口时候出现的一个问题

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

WBOY
WBOYOriginal
2016-06-06 20:51:131119Durchsuche

我想用 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></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>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	#AllowOverride All 
	Order allow,deny
	allow from all

	DirectoryIndex index.php index.html index.htm

回复内容:

我想用 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></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>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	#AllowOverride All 
	Order allow,deny
	allow from all

	DirectoryIndex index.php index.html index.htm

你的规则有问题。

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></directory>
    Options FollowSymLinks
    AllowOverride None
    #AllowOverride All 


<directory></directory>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    #AllowOverride All 
    Order allow,deny
    allow from all

    DirectoryIndex index.php index.html index.htm

/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>

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn