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

Nic*_*ote 7 apache mod-rewrite tomcat mod-jk

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

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

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

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

www.mydomain.com/demo -> tomcat:8101
www.mydomain.com/test -> tomcat:8102
www.mydomain.com/     -> tomcat:8100
Run Code Online (Sandbox Code Playgroud)

这是通过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>
Run Code Online (Sandbox Code Playgroud)

这一切都很棒.我还使用类似的VirtualHost标记进行SSL设置并运行https连接;

<VirtualHost _default_:443>
    JkMount /demo* demoTomcat 
    JkMount /test* testTomcat
    JkMount /* rootTomcat
... SSL Stuff follows ....
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我的SSL证书仅适用于www.mydomain.com而不是mydomain.com.

我被建议使用follow 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]
Run Code Online (Sandbox Code Playgroud)

我已经在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的东西?

anu*_*ava 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>
Run Code Online (Sandbox Code Playgroud)

此规则的作用是如果方案是 https 并且您的 http 主机不是则将 www.mydaomain.com 请求重定向https://example.com/foohttps://www.example.com/foo301 http 状态。

  • 最终让它发挥作用,但是有了这些;RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L] (2认同)