Apache URL重写:内部服务器错误

Apache URL重写:内部服务器错误,apache,mod-rewrite,url-rewriting,Apache,Mod Rewrite,Url Rewriting,我对Apache的重写规则有点问题 这是我的规则 Options +FollowSymLinks RewriteEngine On RewriteBase / RewriteRule query/(.*) /php/query.php?name=$1 [L] RewriteRule page/(.*) /php/page.php?page=$1 [L] 它工作得很好。但当我尝试添加以下规则来重写与前面两条规则不匹配的URL时 RewriteRule .* /php/page.php?pag

我对Apache的重写规则有点问题

这是我的规则

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule query/(.*) /php/query.php?name=$1 [L]
RewriteRule page/(.*) /php/page.php?page=$1 [L]
它工作得很好。但当我尝试添加以下规则来重写与前面两条规则不匹配的URL时

RewriteRule .* /php/page.php?page=home

服务器响应“内部服务器错误”。为什么?

您可以使用
RewriteLog
查看发生了什么,但即使使用
[L]
也可以确保在规则集上始终重新检查重写的url(这称为内部重定向)

因此,在最后一个“一网打尽”之前添加一些
RewriteCond
,或者防止它在内部重定向上运行,方法如下:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
您还可以在最终的catch all上添加
[NS]
[nosubreq]
标记,其作用相同


但是阻止你的内部重定向规则也意味着它将永远不会在之前的任何规则之后应用,并且有一天你可能会想要它。因此,请注意下一条规则。

您可以使用
重写日志来查看发生了什么,但即使使用
[L]
也可以确保在规则集上始终重新检查重写的url(这称为内部重定向)

因此,在最后一个“一网打尽”之前添加一些
RewriteCond
,或者防止它在内部重定向上运行,方法如下:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
您还可以在最终的catch all上添加
[NS]
[nosubreq]
标记,其作用相同

但是阻止你的内部重定向规则也意味着它将永远不会在之前的任何规则之后应用,并且有一天你可能会想要它。所以要注意下一条规则。

谢谢

最后,我的解决方案是:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule query/(.*) /php/query.php?name=$1 [L]
RewriteRule page/(.*) /php/page.php?page=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ page/home [L,R]
RewriteRule ^$ page/home [NS,R]
谢谢

最后,我的解决方案是:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule query/(.*) /php/query.php?name=$1 [L]
RewriteRule page/(.*) /php/page.php?page=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ page/home [L,R]
RewriteRule ^$ page/home [NS,R]

查看服务器的错误日志!(很可能您在这里创建了一个无休止的重定向,因为
*
当然也匹配
php/page.php
)第二个规则之前匹配。*不,不是对于
/php/page.php?page=home
的(内部)请求,规则存储在.htaccess文件中。文档中说,在这种情况下,重写的请求将再次传递给引擎。请查看服务器的错误日志!(很可能您在这里创建了一个无休止的重定向,因为
*
当然也匹配
php/page.php
)第二个规则之前匹配。*不,不是对于
/php/page.php?page=home
的(内部)请求,规则存储在.htaccess文件中。文档中说,在这种情况下,重写的请求会再次传递给引擎。