Many posters have problems debugging their RewriteRule and RewriteCond statements within their .htaccess files. Most of these are using a shared hosting service and therefore don't have access to the root server configuration. They cannot avoid using .htaccess files for rewriting and cannot enable a RewriteLogLevel" as many respondents suggest. Also there are many .htaccess-specific pitfalls and constraints are aren't covered well. Setting up a local test LAMP stack involves too much of a learning curve for most.

所以我的问题是我们建议他们如何自己调试他们的规则。以下是我的一些建议。其他建议将不胜感激。

Understand that the mod_rewrite engine cycles through .htaccess files. The engine runs this loop: 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 So your rules will get executed repeatedly and if you change the URI path then it may end up executing other .htaccessfiles if they exist. So make sure that you terminate this loop, if necessary by adding extra RewriteCond to stop rules firing. Also delete any lower level .htaccess rewrite rulesets unless explicitly intent to use multi-level rulesets. Make sure that the syntax of each Regexp is correct by testing against a set of test patterns to make sure that is a valid syntax and does what you intend with a fully range of test URIs. See answer below for more details. Build up your rules incrementally in a test directory. You can make use of the "execute the deepest .htaccess file on the path feature" to set up a separate test directory (tree) and debug rulesets here without screwing up your main rules and stopping your site working. You have to add them one at a time because this is the only way to localise failures to individual rules. Use a dummy script stub to dump out server and environment variables. (See Listing 2)If your app uses, say, blog/index.php then you can copy this into test/blog/index.php and use it to test out your blog rules in the test subdirectory. You can also use environment variables to make sure that the rewrite engine in interpreting substitution strings correctly, e.g. RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html] and look for these REDIRECT_* variables in the phpinfo dump. BTW, I used this one and discovered on my site that I had to use %{ENV:DOCUMENT_ROOT_REAL} instead. In the case of redirector looping REDIRECT_REDIRECT_* variables list the previous pass. Etc.. Make sure that you don't get bitten by your browser caching incorrect 301 redirects. See answer below. My thanks to Ulrich Palha for this. The rewrite engine seems sensitive to cascaded rules within an .htaccess context, (that is where a RewriteRule results in a substitution and this falls though to further rules), as I found bugs with internal sub-requests (1), and incorrect PATH_INFO processing which can often be prevents by use of the [NS], [L] and [PT] flags.

还有什么评论或建议吗?

清单1——phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

当前回答

如果您正在创建重定向,请使用curl进行测试,以避免浏览器缓存问题。 使用-I只获取http头信息。 使用-L跟随所有重定向。

其他回答

在线。htaccess重写测试

我在谷歌上找到了这个RegEx的帮助,它为我节省了很多时间,每次我做一个小的修改都要上传新的。htaccess文件。

来自网站:

htaccess测试仪 要测试你的htaccess重写规则,只需填写你应用规则的url,把你的htaccess的内容放在更大的输入区域,然后按“现在检查”按钮。

如果你正在使用url,你可能想要检查是否“启用Mod重写”

确保在变量前面使用百分号,而不是美元号。

它是%{HTTP_HOST},不是${HTTP_HOST}。在error_log中什么也没有,也没有内部服务器错误,您的regexp仍然是正确的,规则只是不匹配。如果你经常使用django / genshi模板,并且在肌肉内存中使用${}作为变量替换,这真的很可怕。

不要忘记,在.htaccess文件中,它是一个相对URL匹配。

在.htaccess文件中,下面的RewriteRule永远不会匹配:

RewriteRule ^/(.*)     /something/$s

下面是一些关于测试规则的额外技巧,可以简化共享主机上用户的调试

1. 使用伪用户代理

在测试一个新规则时,添加一个条件,以只使用一个伪用户代理执行它,您将在请求中使用这个假用户代理。这样就不会影响到你网站上的其他人。

e.g

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

如果您正在使用Firefox,您可以使用用户代理切换器来创建假用户代理字符串并进行测试。

2. 在测试完成之前不要使用301

我见过很多帖子,人们仍然在测试他们的规则,他们使用的是301。不喜欢。

如果你没有在你的网站上使用建议1,那么不仅是你,而且当时访问你网站的任何人都将受到301的影响。

请记住,它们是永久的,并被浏览器积极缓存。 在确定之前,先用302,然后再换成301。

3.请记住,301缓存在您的浏览器中

如果您的规则不起作用,并且看起来对您来说是正确的,并且您没有使用建议1和2,那么在清除浏览器缓存后或在私人浏览时重新测试。

4. 使用HTTP捕获工具

使用Fiddler之类的HTTP捕获工具来查看浏览器和服务器之间的实际HTTP流量。

虽然其他人可能会说您的网站看起来不正确,但您可以看到并报告所有的图像、css和js都返回404错误,从而迅速缩小问题范围。

虽然其他人会报告说你从URL A开始,结束于URL C,你将能够看到他们从URL A开始,被302重定向到URL B和301重定向到URL C。即使URL C是最终目标,你也会知道这对SEO是不利的,需要修复。

您将能够看到在服务器端设置的缓存头,重放请求,修改请求头以测试....