许多海报在他们的.htaccess
文件中调试他们的RewriteRule和RewriteCond语句时会遇到问题。其中大多数使用共享托管服务,因此无法访问根服务器配置。他们不能避免使用.htaccess
文件重写和不能启用RewriteLogLevel"正如许多受访者所言。此外,还有许多__abc0特有的陷阱和约束没有很好地覆盖。对大多数人来说,建立一个本地测试LAMP堆栈涉及太多的学习曲线。
所以我这里的问题是我们如何建议他们< >强调试< / >强他们的规则自己。以下是我的一些建议。其他建议将不胜感激。
.htaccess
文件。引擎运行这个循环:
do
execute server and vhost rewrites (in the Apache Virtual Host Config)
find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
if found(.htaccess)
execute .htaccess rewrites (in the user's directory)
while rewrite occurred
因此,你的规则将被重复执行,如果你改变URI路径,那么它可能最终执行其他__abc0file(如果它们存在)。因此,请确保您终止了此循环,如有必要,可以通过添加额外的RewriteCond
来停止规则触发。也要删除任何较低级别的.htaccess
重写规则集,除非明确地打算使用多级规则集。
确保每个Regexp的语法是正确的通过测试一组测试模式,以确保是一个有效的语法,并对所有测试uri进行测试。详见下面的回答。
在测试目录中增量地构建规则。你可以使用“在路径特征上执行最深的.htaccess
文件”;在这里设置一个单独的测试目录(树)和调试规则集,而不会破坏你的主要规则并停止你的网站工作。您必须一次添加一个,因为这是将失败本地化到单个规则的唯一方法。
blog/index.php
,那么你可以将其复制到test/blog/index.php
中,并使用它来测试你在test
子目录中的博客规则。你也可以使用环境变量来确保重写引擎正确地解释替换字符串。
RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
并在phpinfo转储中查找这些REDIRECT_ *变量。顺便说一句,我使用了这个,并在我的网站上发现我必须使用%{ENV:DOCUMENT_ROOT_REAL}
来代替。在重定向器循环的情况下,REDIRECT_REDIRECT_ *变量列出了前一遍。等。
.htaccess
上下文中的级联规则很敏感,(这就是RewriteRule
导致替换的地方,而这将下降到进一步的规则),因为我发现了内部子请求(1)的错误,以及不正确的PATH_INFO处理,这通常可以通过使用[NS], [L]和[PT]标志来防止。
还有什么评论或建议吗?
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);