Apache2重写规则没有被提取

时间:2016-03-23 10:55:05

标签: mod-rewrite apache2

我的域名使用了2个单独的虚拟主机文件:一个用于:80和一个用于:443

:80设置非常简单,唯一的工作就是重定向到:443:

<VirtualHost *:80>
    # This is the first host so it's the default.
    # So although I've specified a ServerName and ServerAlias anything else not specified elsewhere will also end up here.
    ServerName www.domain.com
    ServerAlias domain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # Redirect everything to https:
    RewriteEngine on
    RewriteRule ^(.*)$ https://www.domain.com$1 [R=301,L]
</VirtualHost>

:443只需要在网址的开头添加www(如果不存在):

<VirtualHost *:443>
    # This is the first host so it's the default.
    # So although I've specified a ServerName and ServerAlias anything else not specified elsewhere will also end up here.
    ServerName www.domain.com
    ServerAlias domain.com

    ErrorLog ${APACHE_LOG_DIR}/ssl.error.log
    CustomLog ${APACHE_LOG_DIR}/ssl.access.log combined

    # Redirect everything which is not already on the real www domain name to that:
    RewriteEngine on
    RewriteCond %{HTTP_HOST} !www.domain.com
    RewriteRule ^(.*)$ https://www.domain.com$1 [R=301]

    ErrorDocument 404 /404.html
</VirtualHost>

我发现这些重写似乎失败的一个案例:

https://domain.com - &gt;应该指向https://www.domain.com,但它指向https://www.domain.com%24/#。显然,后面的字符阻止DNS服务器找到域。

导致此问题的原因是什么?我已经帮助创建了这些虚拟主机文件,但似乎它们仍未按预期完全正常工作。

但我也想将我的网址重写为更好的网址。我认为我的规则是正确的,并且:443中的重写块看起来像下面的

RewriteEngine on
RewriteCond %{HTTP_HOST} !www.domain.com
RewriteRule ^(.*)$ https://www.domain.com$1 [R=301]

RewriteRule ^subpage/(.+)/?$ subpage.html?$1 [NC]

哪个应该重写

https://www.domain.com/subpage/2 - &gt; https://www.domain.com/subpage.html?2但它现在只是指向我的404文件。

这可能是显而易见的,但我没有看到我的错误。

1 个答案:

答案 0 :(得分:0)

注意:这并没有解决此处所述的问题,但确实解决了潜在的问题。

由于这是一个生产环境(多么尴尬。)我的网络服务器开始时很快就被淹没了。我的公司大大增加了我的预算(我们期待很多流量,但希望它会慢慢积累,但它没有)所以我能够设置多个服务器并在它们前面放置2个HAProxy负载均衡器。我使用HAProxy配置来解决我的问题:

frontend http
    bind MY_IP:80
    redirect prefix http://www.domain.com code 301 if { hdr(host) -i domain.com }
    redirect scheme https code 301 if !{ ssl_fc }

frontend https
    bind MY_IP:443 ssl crt /etc/haproxy/certs/domain.com.pem
    redirect prefix https://www.domain.com code 301 if { hdr(host) -i domain.com }
    reqadd X-Forwarded-Proto:\ https
    default_backend app_pool

backend app_pool
    balance roundrobin
    redirect scheme https if !{ ssl_fc }
    server app-1 MY_IP:80 check
    server app-2 MY_IP:80 check
    server app-3 MY_IP:80 check
    server app-4 MY_IP:80 check

将始终重定向到www.domain.com版本并强制执行HTTPS。在我看来,在HAProxy中进行设置比使用VirtualHost更容易。