apache - 调试 .htaccess 重写规则的技巧

标签 apache .htaccess mod-rewrite

许多发帖者在调试 .htaccess 文件中的 RewriteRule 和 RewriteCond 语句时遇到问题。其中大多数使用共享托管服务,因此无权访问根服务器配置。正如许多受访者所建议的那样,他们无法避免使用 .htaccess 文件进行重写,并且无法启用 RewriteLogLevel”。此外,还存在许多 .htaccess 特定的陷阱并且约束条件没有得到很好的覆盖。对于大多数人来说,设置本地测试 LAMP 堆栈涉及太多的学习曲线。

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

  1. 了解 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 重写规则集,除非明确打算使用多级规则集。

  2. 通过针对一组测试模式进行测试,确保每个正则表达式的语法正确,以确保语法有效,并且通过全面的测试达到您的预期URI。请参阅answer below了解更多详情。

  3. 在测试目录中逐步构建规则。您可以利用“执行路径上最深的 .htaccess 文件”功能来设置在这里建立一个单独的测试目录(树)并调试规则集,而不会搞乱您的主要规则并停止您的站点工作。您必须一次添加一个,因为这是将失败本地化到单个规则的唯一方法。

  4. 使用虚拟脚本 stub 转储服务器和环境变量。 (参见 list 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_* 变量会列出前一个 channel 。等等..

  5. 确保您不会被浏览器缓存错误的 301 重定向所困扰。请参阅answer below 。感谢Ulrich Palha为此。

  6. 重写引擎似乎对 .htaccess 上下文中的级联规则很敏感(这就是 RewriteRule 导致替换的地方,这会进一步导致规则),因为我发现了内部子请求的错误 (1) ,以及不正确的 PATH_INFO 处理,通常可以通过使用 [NS]、[L] 和 [PT] 标志来防止。

还有什么意见或建议吗?

list 1 -- phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

最佳答案

这里有一些关于测试规则的额外提示,可以简化共享主机上用户的调试

1。使用假用户代理

测试新规则时,添加一个条件,以便仅使用将用于请求的fake用户代理来执行该规则。这样就不会影响您网站上的其他任何人。

例如

#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,则可以使用 User Agent Switcher创建假用户代理字符串并进行测试。

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

我看过很多帖子,人们仍在测试他们的规则并且他们正在使用 301。 不要

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

请记住,它们是永久性的,并且会被您的浏览器积极缓存。 使用 302 代替,直到确定为止,然后将其更改为 301。

3。请记住,301 会积极缓存在您的浏览器中

如果您的规则不起作用并且看起来很适合您,并且您没有使用建议 1 和 2,请在清除浏览器缓存后或在隐私浏览状态下重新测试。

4。使用 HTTP 捕获工具

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

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

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

您将能够看到在服务器端设置的缓存 header 、重播请求、修改请求 header 以进行测试......

<小时/>

关于apache - 调试 .htaccess 重写规则的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9153262/

相关文章:

linux - SVN导入: "Error: Could not open the requested SVN filesystem"

java - Apache POI Word 教程。

php - 使用php代码重写URL

.htaccess - Mod 重写删除尾部斜杠后的查询字符串

php - 使用 RewriteRule 时发生内部服务器错误

php - 调用未定义函数 'init_set'

PHP 中的 PHP Web 服务器?

php - 使用 MySQL 数据库进行 URL 重写

php - 如何使用@import 连接 CSS 文件?

.htaccess - 使用漂亮的 url 重写子文件夹