2013-05-02 147 views
1

注意:为简单解释问题并保留基本知识,此处不对代码进行清理。我的生产代码将在处理前清理$ _GET。导致500内部服务器错误的HTACCESS

这里是我的.htaccess文件:

RewriteEngine on 
RewriteCond %{REQUEST_URI} "/files/" 

RewriteRule (.*) $1 [L] 
RewriteRule ^(.*)/(.*)$ ?cat=$1&title=$2 [L] 
RewriteRule ^(.*) ?cat=$1 

这是我的PHP文件:

$cat = $_GET['cat']; 
$title = $_GET['title']; 

if($cat && !$title) { 
    echo 1; 
} 

if($cat && $title) { 
    echo 2; 
} 

如果我去我的测试网址:http://local.testzone.com/cat/titlehttp://local.testzone.com/cat

我得到一个500内部服务器错误。

如果我评论在.htaccess文件的最后一行:

#RewriteRule ^(.*) ?cat=$1 

http://local.testzone.com/cat给我:

未找到

在此服务器上找到请求的URL /猫。

http://local.testzone.com/cat/title给我:

这是它应该做的,按照2我的我的PHP回声如果猫和标题存在。

我的问题是 - 我如何修改访问文件,所以如果只有一只猫,它会回显1?我能做到这一点的唯一方法是手动设置第一个层次是这样的:

RewriteRule ^cat$ ?cat=cat 

这工作,但不会在我写的应用程序。我需要根据URL中的cat值来查询数据库。 cat值可以动态更改,我不能将其硬编码到htaccess文件中。标题工作正常,但我如何获得猫部分功能?

希望我的要求很明确,期待有任何帮助!

+0

您的重写规则导致无限循环,apache可能在10次重定向后中断。尝试审查它们,尤其是这一个:RewriteRule ^(。*)?cat = $ 1 – nicolas 2013-05-02 23:17:53

回答

0

您可以清理一些规则,但是您需要添加一个条件以防止规则循环。重写过程将通过您的规则持续运行请求URI,直到URI停止更改(或达到内部递归限制,即500错误)。

RewriteEngine on 

RewriteRule ^/?files/ - [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/(.*)$ ?cat=$1&title=$2 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*) ?cat=$1