许多发布者在调试文件中的RewriteRule和RewriteCond语句时遇到问题.htaccess
。其中大多数使用共享主机服务,因此无权访问根服务器配置。他们无法避免使用.htaccess
文件进行重写,也无法启用RewriteLogLevel”,正如许多受访者所建议的那样。此外,还有很多.htaccess
特定的陷阱和约束没有得到很好的涵盖。对于大多数人来说,设置本地测试LAMP堆栈涉及太多的学习曲线。
所以我的Q这里是如何将我们建议他们调试他们的规则本身。我在下面提供一些建议。其他建议,将不胜感激。
了解mod_rewrite引擎在
.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路径,则它可能最终会执行其他
.htaccess
文件(如果存在)。因此,如有必要,请通过添加其他内容RewriteCond
来停止触发规则来确保终止此循环。.htaccess
除非明确打算使用多级规则集,否则还请删除所有较低级的重写规则集。通过对一组测试模式进行测试,确保每个Regexp的语法正确,以确保这是一种有效的语法,并使用完整的测试URI来达到您的预期。有关更多详细信息,请参见下面的答案。
在测试目录中逐步建立规则。 您可以使用“
.htaccess
在路径功能上执行最深的文件”来在此处设置单独的测试目录(树)并调试规则集,而无需弄乱您的主要规则并停止站点的工作。您必须一次添加一个,因为这是将故障定位到单个规则的唯一方法。使用虚拟脚本存根转储服务器和环境变量。(请参见清单2),例如,如果您的应用程序使用,
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_ *变量将列出前一遍。等等..确保您不会被浏览器缓存不正确的301重定向所困扰。请参阅下面的答案。我感谢Ulrich Palha。
重写引擎似乎对
.htaccess
上下文中的级联规则很敏感(这是RewriteRule
导致替换的地方,但这属于进一步的规则),因为我发现内部子请求(1)有错误,并且PATH_INFO处理不正确通过使用[NS],[L]和[PT]标志来防止。
还有其他意见或建议吗?
清单1-phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);