我对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
服务器响应“内部服务器错误”。为什么?
答案 0 :(得分:4)
您可以使用RewriteLog
查看发生的情况,但即使使用[L]
,您也可以确保在规则集上重新检查重写的网址(这是调用内部重定向)。
因此,在此最终catch-all之前添加一些RewriteCond
,或者阻止它在内部重定向上运行,这样:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
您还可以在最终的全部内容中添加[NS]
或[nosubreq]
标记,这样做也是如此。
但是,阻止您对内部重定向的规则也意味着它将永远不会在之前的任何规则之后应用,并且有一天您可能需要它。所以要小心下一个规则。
答案 1 :(得分:0)
谢谢!
最后,这是我的解决方案:
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]