重写为https时无限循环

时间:2012-06-26 09:24:34

标签: apache mod-rewrite ssl-certificate

我最近购买了一张通配符ssl证书,将我的网站移至https。 由于Apache无法处理多个虚拟主机,在相同的IP下,在不同的s中,我被迫使用mod_vhost_alias中的VirtualDocumentRoot。这首先解决了我使用Apache和通配符证书的问题,但是时间不长。

出于必要,我决定将我网站的主页移动到域的根目录(即http://domain.com,而不是http://www.domain.com)。移动后,我建立的迁移到https的规则会导致服务器无限循环,导致错误500.请注意,应用于任何子域的相同规则仍然有效,将任何http重写为https。

错误:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

我的VirtualHost配置:

<VirtualHost IP:443>
   ...
   VirtualDocumentRoot /.../public_html/%1/
   ...
   VirtualScriptAlias /.../public_html/%1/cgi-bin/
   ...
</VirtualHost>

我的.htaccess配置:

SetEnv APPLICATION_ENV development
Options +FollowSymlinks -Indexes
RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.domain.com [NC,OR]
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://domain.com/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ - [NC,L]
RewriteRule ^(.*)$ index.php [NC,L]

<FilesMatch "\\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>

我的应用程序是使用Zend Framework构建的。

这里的主要谜团是它为什么适用于任何子域,但是当我使用根子域时则不然。什么可能导致问题的暗示?有什么方法可以看到de .htacess的重写吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [L]

的变化:

  • www.domain.com domain.com 可以在一行中匹配,所以就这样做了
  • 检查HTTPS而不是SERVER_PORT
  • 根据请求在相同域名上重定向到HTTPT(如果您希望所有域名都指向一个名称,请进行更改)。
  • 而不是制定一个“杀死”重写的规则,在OR中使用3个RewriteCond,否定了cond适用于有问题的真实规则
  • 匹配NC
  • 时无需设置.*标记

.htaccess的其余部分应保持不变(不包括这些部分)。