fragen stichworte

Warum schlagen einige Umschreibungsregeln fehl, während AJP alle meine Anfragen an Tomcat weiterleitet?

Ich habe einen Apache-Server, der mod_proxy_ajp verwendet, damit Jboss/Tomcat5.5 alle Anforderungen verarbeitet. So habe ich Apache 2.2.17 konfiguriert, und es funktioniert größtenteils:

# Proxy pass all work to Tomcat, mod_jk 1.2.31
<Location/>
    # ProxyPass/http://localhost:8080/
    ProxyPass ajp://localhost:8009/
    ProxyPassReverse ajp://localhost:8009/
</Location>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
#  and , to handle the redirect of the root dir
Redirect permanent/https://%{HTTP_HOST}%/myapp

Wenn ProxyPass aktiviert ist, kann ich leider keine mod_rewrite-Regeln verwenden, außer den obigen. Wie gehe ich mit dieser Situation um?

Ich versuche, eine Umschreibungsregel ähnlich dieser RedirectMatch-Regel zu erstellen (die nur funktioniert, wenn ich ProxyPass ausschalte):

RedirectMatch ^/(?i)myagency   "/myapp?agency=MyAgency%20LA"

Ein weiteres seltsames Ding, das ich gefunden habe und das einen Einblick in mein Problem geben kann, ist hier.

antworten

Ok, ich habe es endlich für mich herausgefunden. Das AJP-Protokoll arbeitet anders als die Regeln des HTTP-Typs und mischen sich daher nicht. Um das Problem zu lösen, musste ich aufhören, alles an AJP umzuleiten, und die Anwendung stattdessen nur mit AJP umleiten. Hier war die Antwort:

# don't ProxyPass through the "/" dir location,
# since it breaks the mod_rewrite rules
<Location/myapp>
    ProxyPass ajp://localhost:8009/myapp
    ProxyPassReverse ajp://localhost:8009/myapp
</Location>
RewriteEngine On
# rule to redirect from http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# rule to redirect/ to the app context since nothing is served at/
Redirect//myapp?name=
# supplemental rules to handle URI shortcuts
RedirectMatch ^/(?i)name1  /myapp?name=NameOne
RedirectMatch ^/(?i)name2   "/myapp?name=Name%20Two"

Sie können Ihre ProxyPass- und ProxyPassReverse-Direktiven stattdessen in RewriteRule-Direktiven konvertieren. Verwenden Sie [P], um die Anforderung zu proxy zu verwenden, z. B.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteRule (.*) ajp://localhost:8009/$1 [P]