我最近一直在为一个网络服务器解决一些.htaccess重写问题,我提供的Web服务器由咨询公司外部提供给我的代码。我一直在从"重写不起作用"的角度来追逐这个问题,但是我想我已经发现实际问题是重写会导致白屏死机。
我的网站
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文件并单独注释掉了匹配的行,一旦没有匹配,那么我就会被带到我的主页并可以正常浏览。
我通过创建一个测试来进一步测试.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 在某些情况下解释重写给出的变量 OK
但现在我无可救药地陷入了困境。我不知道从哪里开始测试或调试 php,我无法想象为什么当它似乎正确解释重写中的变量并且可以在不使用重写的情况下打开这些页面时,为什么某些 php 会倒下并白屏。
有人遇到过这个吗?我想知道这是一些PHP服务器配置还是我错过的东西。
迈克火箭评论后的更新
进一步的测试让我得到以下.htaccess。 前 4 行引用测试.php仅用于测试,后 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]
我的新测试.php包含
<?php
echo 't1: '.$_GET['t1'].'<br/>';
echo 't2: '.$_GET['t2'].'<br/>';
echo 't3: '.$_GET['t3'].'<br/>';
echo 't4: '.$_GET['t4'].'<br/>';
?>
我看到的是,对于测试.php行用http://testsite.website.com/test/test2/test3/test4/
是前 2 个会产生这样的破碎输出
t1: test.php/test2
t2: test3
t3: test4
t4:
并散列出前 2 行,测试中的后 2 行.php相关部分将为我提供我想要的输出。
t1: test.php
t2: test2
t3: test3
t4: test4
我在这里发现可怕的是,我的第一个变量"test"恰好与我的 PHP 文件本身具有相同的名称,如果是这种情况,它会通过 PHP 文件的名称作为变量而不是单词 test。
这
http://testsite.website.com/测试/测试2/测试3/测试4/生产
t1: test.php
t2: test2
t3: test3
t4: test4
但是这个
http://testsite.website.com/测试1/测试2/测试3/测试4/
产生这个
t1: test1
t2: test2
t3: test3
t4: test4
我有一种感觉,这是我问题的根源。在我的生活情况下,我有
my.website.com/news/it
调用新闻.php文件也是如此。所以它每次都传递"新闻.php"而不是"新闻"。我觉得这不正常,我应该能够以某种方式阻止这种情况发生......
您需要关闭Multiviews,这是Apache的内容协商指令。
Options -Multiviews
打开 Multiviews 后,Apache 会隐式搜索名称与当前请求名称相似的文件,无论您是否已重写请求。
在您的情况下,您正在将/news/*
重写为 /news.php
.Multiviews 确定了这些的相似性,并决定无论如何都要为news.php
服务。
关闭多视图将防止此行为,并且您的规则将按预期工作。