如何将 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/foo
到https://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 中禁止 url?
Ubuntu系统启用Apache Mod_rewrite模块