如何在Apache -> mod_jk -> tomcat设置中使用mod_rewrite?

7

和我之前的问题相关。

现在我有一个我相当喜欢的设置;

Apache httpd监听端口80,接受http和https连接。多个Tomcat实例运行在多个AJP端口上。

Mod_Jk将不同的url请求发送到不同的Tomcat实例;

www.mydomain.com/demo -> tomcat:8101
www.mydomain.com/test -> tomcat:8102
www.mydomain.com/     -> tomcat:8100

在httpd.conf(或包含的子文件)中使用以下配置来实现此目标:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

NameVirtualHost *:80

<VirtualHost *:80>
    JkMount /demo* demoTomcat (workers.properties not shown)
    JkMount /test* testTomcat
    JkMount /* rootTomcat
</VirtualHost>

这一切都很顺利。我还设置了SSL并使用类似的VirtualHost标签来运行https连接;

<VirtualHost _default_:443>
    JkMount /demo* demoTomcat 
    JkMount /test* testTomcat
    JkMount /* rootTomcat
... SSL Stuff follows ....

我现在遇到的问题是我的SSL证书只针对www.mydomain.com而不是mydomain.com。

有人建议我使用以下mod_rewrite调用:

Options +FollowSymlinks
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.|$) [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [PT,L]

我之前在httpd.conf文件中插入了这些mod_jk规则之前和之后。Apache起初报错,说RewriteEngine是一个无效的命令,但当我记得先运行LoadModule命令时,问题就消失了 :) 现在Apache可以重新启动,服务器也能够接受请求,一切都像以前一样正常...但是,这些mod_rewrite命令似乎没有任何效果?
我在浏览器中输入http://mydomain.com,结果只是正常显示我的网站。网址似乎没有改变成http://www.mydomain.com,并且当我尝试访问安全区域时,我会收到警告说mydomain.com不安全,并且正在为我提供来自名为www.mydomain.com的其他网站的证书(为什么这是一个问题,不能使用一些逻辑来意识到它是同一个站点,我不知道!)。
我是否将mod_rewrite规则放错了位置?我看过应该可以工作,重写应该将网址更改为www.,然后进一步通过mod_jk处理所有内容?
1个回答

2

请在您的Apache配置文件中,最后一个jkmount行之后添加以下代码:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} =on
        RewriteCond %{HTTP_HOST} !^www\.example\.name$ [NC]
        RewriteRule ^ https://www.example.name%{REQUEST_URI} [NE,L,R=301]
    </IfModule>

此规则的作用是,如果协议为https且您的http主机不是www.mydaomain.com那么将请求https://example.com/foo重定向到https://www.example.com/foo,并使用301 http状态码。

嗨,没有。我已经在VirtualHost标签内外都尝试了那个片段,包括vhost和ssl标签之间。我尝试过在JkMount行之前和之后进行尝试。除了浏览器可能挂起而以前直接抱怨无效证书之外,似乎什么都没有发生!我已将重写日志级别设置为9!日志文件被创建了(因此模块必须工作),但从未记录任何内容!始终为0字节! - Nick Foote
@Nick Foote:由于此规则仅适用于https,因此上述规则的位置仅在<VirtualHost _default_:443>标签结束之前。另外,您可以尝试将此行RewriteCond %{HTTPS} =on替换为我上面回答中的这行代码:RewriteCond {SERVER_PORT} =443 - anubhava
2
最终成功了,但是需要这些代码:RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L] - Nick Foote
1
@Nick Foote:很高兴你弄对了,是的,我在我的RewriteCond中漏掉了! - anubhava
1
我试图编辑你的答案以修复缺失的 ! 字符,但是 SO 抱怨使用了 mydomain.com... 不想通过替换域名来大幅修改你的答案(SO 建议使用 example.com),因为它实际上准确回答了 OP 的问题... - mmuller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接