如何将 mod_rewrite 与 Apache -> mod_jk -> tomcat 设置一起使用?

Posted

技术标签:

【中文标题】如何将 mod_rewrite 与 Apache -> mod_jk -> tomcat 设置一起使用?【英文标题】:How to use mod_rewrite with Apache -> mod_jk -> tomcat setup? 【发布时间】:2011-07-21 05:08:50 【问题描述】:

与我之前的一些问题有关。

我现在有了一个我非常喜欢的设置;

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

Mod_Jk 正在向不同的 tomcat 实例发送不同的 url 请求;

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>

这一切都很好。我还使用类似的 VirtualHost 标记为 https 连接设置和运行 SSL;

<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 规则放在了错误的位置?我读过它应该可以工作,重写应该将 url 更改为 www。然后传递给 mod_jk 的东西以获取更多信息?

【问题讨论】:

【参考方案1】:

将此 sn-p 放在您的 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>

这条规则的作用是 IF 方案是 https 而你的 http 主机是 NOT www.mydaomain.com THEN 重定向请求 https://example.com/foohttps://www.example.com/foo 具有 301 http 状态。

【讨论】:

嗨,没有。我已经在 VirtualHost 标签内外尝试了 sn-p,包括 vhost 标签和 ssl 标签。我在 JkMount 线之前和之后都尝试过。似乎什么都没有发生,除了浏览器可能在它直接抱怨无效证书之前挂起!我已将重写日志级别设置为 9!日志文件被创建(所以模块必须工作)但没有任何记录! 0 字节! 我不知道我在这里缺少什么。我什至尝试过有人建议的规则,它只是从 www.mydomain.com/foo.html 重定向到我的主页,但它什么也没做。并且没有任何记录。据我所知,mod_rewrite 永远不会触发,除了创建一个空的日志文件之外什么也不做! 最终让它工作了,但有了这些; RewriteCond %HTTP_HOST !^www.domain.com$ [NC] RewriteRule ^(.*)$ domain.com/$1 [R=301,L] @Nick Foote:很高兴你做对了,是的,我在 RewriteCond 中错过了! 我试图编辑您的答案以修复缺少的 ! 字符,但 SO 抱怨使用 mydomain.com... 不想通过替换域来改变您的答案(所以建议使用 example.com)考虑到它实际上准确地回答了 OP 的问题......

以上是关于如何将 mod_rewrite 与 Apache -> mod_jk -> tomcat 设置一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Apache如何开启Mod_rewrite模块以及PHPWind伪静态(全伪)

apache mod_rewrite 模块未安装

如何根据查询字符串在 apache mod_rewrite 中禁止 url?

Ubuntu系统启用Apache Mod_rewrite模块

apache mod_rewrite:如何根据其他目录中的文件存在为同一目录添加不同的重写规则?

Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤