505在.htaccess文件中传递查询字符串变量时出错

时间:2016-02-20 23:38:14

标签: php apache .htaccess mod-rewrite

我必须传递一个查询字符串变量" _page"通过.htaccess文件,它会产生505(内部服务器)错误。

这是我的.htaccess文件:

DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
#Make sure that there is ALWAYS a querystring variable named "__page"
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*\.(php|xml))$ $1?__page=$1 [L,QSA]

#Append ".php" to the requested file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php?__page=$1.php [L,QSA]
</IfModule>

当我评论该行

#RewriteRule ^(.*\.(php|xml))$ $1?__page=$1 [L,QSA]

在.htaccess文件中,505继续,但它会显示警告&#34;未定义的索引:__ page&#34;

1 个答案:

答案 0 :(得分:0)

在* .php和* .xml上请求您收到500错误,因为您的规则导致服务器上出现无限循环错误。

#RewriteRule ^(.*\.(php|xml))$ $1?__page=$1 [L,QSA]

上述规则重写

  • /foo.php =&gt; /foo.php?__page=foo.php

在第二次重写迭代

  • /foo.php?__ page = foo.php =&gt; /foo.php?__page=foo.php

正如您所看到的,在第二次重写迭代中,目标URL正在重写自身。这种情况一直持续到第10次迭代,服务器返回500错误。

要避免无限循环错误,必须排除要重写的目标路径。

在您的情况下,目标路径是:

/foo.php?__ page = foo.php

要从重写中排除此项,您将使用

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*\.(php|xml))$ $1?__page=$1 [L,QSA]

表示&#34;没有查询字符串&#34;,条件表示如果没有查询字符串,则将应用该规则。这将忽略第二次迭代。

(希望这会有所帮助!)