htaccess 重定向循环仅在两台服务器中的一台上

htaccess 重定向循环仅在两台服务器中的一台上

我在两台服务器上安装了 Web 应用程序。在其中一台服务器上,当我访问主页时,浏览器中出现“错误代码:ERR_TOO_MANY_REDIRECTS”错误,而在另一台服务器上一切正常。两台服务器都运行 apache 2.4。

apache 配置中的哪一部分与重定向规则相关?我应该在哪里查找这两个配置之间的差异?

为了以防万一,这里是 htaccess 文件:

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

  # Get rid of index.php
  RewriteCond %{REQUEST_URI} /index\.php
  RewriteRule (.*) index.php?rewrite=2 [L,QSA]

  # Rewrite all directory-looking urls
  RewriteCond %{REQUEST_URI} /index.php/$
  RewriteRule (.*) index.php?rewrite=1 [L,QSA]

  # Try to route missing files
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} public\/ [OR]
  RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
  RewriteRule . - [L]

  # If the file doesn't exist, rewrite to index
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]

</IfModule>

# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On

# @todo This may not be effective in some cases
FileETag Size

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>

答案1

我经常发现这种不同的行为可以归因于配置的差异。为此,我编写了一个脚本(httpd-转储-配置)来扁平化 httpd.conf,这样我就可以对其进行区分,这样我就可以审核集群节点之间或环境之间的差异(甚至通过 SSH)

虽然它不会检查 .htaccess 文件,但它仍然可以帮助找到容易被忽视的 .htaccess 文件:

find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print

我不建议尝试使用 ssh&diff 进行上述操作,如下所示(因为转义会杀死你)

比较两台机器的非.htaccess配置:

diff <(httpd-dump-config) \
     <(ssh webserverB.dom httpd-dump-config)

还有可能从代码中发出重定向(比如 PHP 发送位置标头;就像我见过的很多 PHP 中经常出现的那样)。

答案2

您在所有浏览器上都遇到此错误吗?

每次我遇到这个问题,要么是某个特定浏览器的小故障,要么是奇怪的 URL 导致的。


重写规则通常是这样的

RewriteEngine on
RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule   ^(.+)                             http://webserverB.dom/$**1

“这里的问题是,这只适用于 DocumentRoot 内的页面。虽然您可以添加更多条件(例如,还可以处理主目录等),但还有更好的变体:”

RewriteEngine on
RewriteCond   %{REQUEST_URI} !-U
RewriteRule   ^(.+)          http://webserverB.dom/$1**

“这使用了 mod_rewrite 的 URL 预读功能。结果是,这种方法适用于所有类型的 URL,是一种安全的方法。但它会对 Web 服务器的性能产生影响,因为每个请求都会产生一个内部子请求。因此,如果您的 Web 服务器运行在强大的 CPU 上,请使用这种方法。如果机器速度较慢,请使用第一种方法,或者最好使用 ErrorDocument CGI 脚本。”

您还可以查看扩展重定向

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

相关内容