我最近为一个网络服务器与一些.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
这是完美的。我可以从这里的重写测试工具中复制粘贴这个
进入我的浏览器并且文章打开正常。转到主页面并浏览网站(当前关闭了漂亮的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
作为网页。 我被迫得出结论
但现在我无可救药地陷入困境。我不知道从哪里开始测试或调试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;每次。我觉得这不正常,我应该能够以某种方式阻止这种情况发生......
答案 0 :(得分:0)
您需要关闭Multiviews,这是Apache的内容协商指令。
Options -Multiviews
当打开Multiviews时,Apache会隐式搜索名称与当前请求名称相似的文件,无论是否重写了请求。
在您的情况下,您正在重写/news/*
至/news.php
。多视图标识了这些内容的相似性,并决定无论如何都要提供news.php
。
关闭Multiviews将阻止此行为,您的规则将按预期工作。