.htaccess重写导致死亡的白人

时间:2016-02-23 17:16:01

标签: php apache .htaccess mod-rewrite url-rewriting

我最近为一个网络服务器与一些.htaccess重写问题进行了斗争,我提供了一个由咨询公司提供给我的代码。我一直在从“重写不工作”的角度来追逐这个问题'但是我想我发现实际的问题是重写导致白屏死机。

我的网站

http://it-news.awesome.net/news/it/153/coverstory/

我的.htaccess

RewriteRule ^news/(.*)/(.*)/(.*)/$ news.php?department=$1&newsid=$2&newstitle=$3 [NE,L]
RewriteRule ^news/(.*)/(.*)/$ news.php?department=$1&archive=$2 [NE,L]
RewriteRule ^news/(.*)/$ news.php?department=$1&archive=0 [NE,L]

将生成输出网址

http://it-news.awesome.net/news.php?department=it&newsid=153&newstitle=coverstory

这是完美的。我可以从这里的重写测试工具中复制粘贴这个

http://htaccess.mwl.be/

进入我的浏览器并且文章打开正常。转到主页面并浏览网站(当前关闭了漂亮的URL)将显示所有这些页面,一切正常。

我尝试使用

的那一刻
http://it-news.awesome.net/news/it/153/coverstory/

链接,我点击了白屏死机。我已经逐步浏览了.htaccess文件并单独注释了匹配的行,一旦没有匹配,我就可以访问我的主页并正常浏览。

我通过使用代码

创建test.php进一步测试了这一点
<?php     
echo $_GET['var'].' "this is static text" '.$_GET['var2'];
?>

并创建重写规则

RewriteRule ^(.*)/(.*)$ test.php?var=$1&var2=$2 [NC,L]

这可行。

http://it-news.awesome.net/testvariable1/testvariable2/

输出

testvariable1 "this is static text" testvariable2

作为网页。 我被迫得出结论

  1. 我的网络服务器重写正常工作
  2. php解释从重写中给出的变量在某些情况下确定
  3. 但现在我无可救药地陷入困境。我不知道从哪里开始测试或调试php,我无法想象为什么有些php会在重写时正确地解释变量并且可以打开那些页面时打开它们并且可以打开这些页面。使用重写。

    有人碰到过这个吗?我想知道它是否是某些PHP服务器配置或者我错过了什么。

    在Mike Rocket发表评论后更新

    进一步测试让我得到以下.htaccess。引用test.php的前4行仅用于测试,而最低3行是真正有希望的工作文档。

    RewriteBase /
    RewriteEngine On
    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    RewriteRule ^hello\.html$ redir.html
    RewriteRule (.*)\.xml(.*) $1.php$2 [nocase]
    RewriteRule ^(wordpress|user)($|/) - [L]
    RewriteRule ^(mysqladmin|user)($|/) - [L]
    RewriteRule ^(admin|user)($|/) - [L]
    
    RewriteRule ^(.*)/(.*)/(.*)/(.*)$ test.php?t1=$1&t2=$2&t3=$3&t4=$4 [NE,NC,L]
    RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ test.php?t1=$1&t2=$2&t3=$3&t4=$4 [NE,NC,L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$ test.php?t1=$1&t2=$2&t3=$3&t4=$4 [NE,NC,L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ test.php?t1=$1&t2=$2&t3=$3&t4=$4 [NE,NC,L]
    
    
    RewriteRule ^news/(.*)/(.*)/(.*)/$ news.php?department=$1&newsid=$2&newstitle=$3 [NE,L]
    RewriteRule ^news/(.*)/(.*)/$ news.php?department=$1&archive=$2 [L]
    RewriteRule ^news/(.*)/$ news.php?department=$1&archive=0 [L]
    

    我的新test.php包含

    <?php
    
    echo 't1: '.$_GET['t1'].'<br/>';
    echo 't2: '.$_GET['t2'].'<br/>';
    echo 't3: '.$_GET['t3'].'<br/>';
    echo 't4: '.$_GET['t4'].'<br/>';
    
    ?>
    

    我看到的是test.php行 运用 http://testsite.website.com/test/test2/test3/test4/

    是前2个会像这样产生破碎的输出

    t1: test.php/test2
    t2: test3
    t3: test4
    t4: 
    

    并且排出前两行,test.php相关部分中的第二行将给出我想要的输出。

    t1: test.php
    t2: test2
    t3: test3
    t4: test4
    
    我在这里发现的很可怕,是我的第一个变量&#39; test&#39;恰巧与我的php文件本身具有相同的名称,如果是这种情况,它会将php文件的名称作为变量而不是单词test给出。

    这个

    http://testsite.website.com/测试 / TEST2 / TEST3 / TEST4 / 产生

    t1: test.php
    t2: test2
    t3: test3
    t4: test4
    

    但是这个

    http://testsite.website.com/ TEST1 / TEST2 / TEST3 / TEST4 /

    产生这个

    t1: test1
    t2: test2
    t3: test3
    t4: test4
    

    我觉得这是我问题的根源。在我的现场情况下,我有

    my.website.com/news/it

    也调用news.php文件。所以它传递了&news; news.php&#39;而不是&#39;新闻&#39;每次。我觉得这不正常,我应该能够以某种方式阻止这种情况发生......

1 个答案:

答案 0 :(得分:0)

您需要关闭Multiviews,这是Apache的内容协商指令。

Options -Multiviews

当打开Multiviews时,Apache会隐式搜索名称与当前请求名称相似的文件,无论是否重写了请求。

在您的情况下,您正在重写/news/*/news.php。多视图标识了这些内容的相似性,并决定无论如何都要提供news.php

关闭Multiviews将阻止此行为,您的规则将按预期工作。