0

我最近购买了通配符 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 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 框架构建的。

这里的主要谜团是为什么它适用于任何子域,但当我使用根子域时却不行。任何可能导致问题的提示?有什么办法可以让我看到 .htacess 所做的所有重写?

4

1 回答 1

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.comdomain.com可以在一行中匹配,也是如此
  • 检查HTTPS而不是SERVER_PORT
  • 根据请求重定向到同一域名上的 HTTPT(如果您希望所有人都指向一个名称,请更改)。
  • 而不是制定一个会“杀死”重写的规则,在 OR 中有 3 个 RewriteCond,否定了 cond 应用于真正的规则
  • 匹配时没有设置NC标志的点.*

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

于 2012-06-26T11:58:17.343 回答