Apache URL เขียนใหม่ใน reverse proxy


12

ฉันปรับใช้ Apache หน้าแอปพลิเคชันที่โฮสต์โดย Karaf (Apache และ Karaf อยู่บนเซิร์ฟเวอร์ที่แยกต่างหาก) ฉันต้องการ Apache ให้ทำงานเป็น reverse proxy และซ่อนบางส่วนของ URL

URL ที่จะได้รับเข้าสู่ระบบในหน้าของแอพลิเคชันโดยตรงจากเซิร์ฟเวอร์ app http://app-server:8181/jellyfishเป็น หน้าจะให้บริการโดย Jetty instance ที่ทำงานภายใน Karaf แน่นอนว่าพฤติกรรมนี้มักจะถูกปิดกั้นโดยไฟร์วอลล์สำหรับทุกอย่างยกเว้นพร็อกซีเซิร์ฟเวอร์ย้อนกลับ

เมื่อปิดไฟร์วอลล์หากคุณกด URL นี้ Jetty จะโหลดหน้าเข้าสู่ระบบ แถบที่อยู่ของเบราว์เซอร์เปลี่ยนไปอย่างถูกต้องhttp://app-server:8181/jellyfish/login?0และทุกอย่างทำงานได้

สิ่งที่ฉันต้องการคือhttp://web-server(เช่นจากรูท) เพื่อแม็พกับ Jetty บนเซิร์ฟเวอร์แอปด้วยชื่อของแอพ ( jellyfish) ที่ถูกระงับ เช่นเบราว์เซอร์จะเปลี่ยนไปแสดงhttp://web-server/login?0ในแถบที่อยู่และ URL และเนื้อหาที่ตามมาทั้งหมดจะแสดงพร้อมกับโดเมนของเว็บเซิร์ฟเวอร์และไม่มีjellyfishความยุ่งเหยิง

ฉันสามารถให้ Apache ทำงานเป็น reverse proxy อย่างง่ายโดยใช้ config (ตัวอย่าง): -

ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/

... แต่สิ่งนี้ต้องการ URL ของเบราว์เซอร์ที่จะมีjellyfishและไปที่ URL ราก ( http://web-server) ให้ 404 ไม่พบ

ฉันใช้เวลาส่วนใหญ่พยายามที่จะใช้ทั้งที่mod_rewriteมีและไม่มี[P]ธงเพื่อรับสิ่งนี้ แต่ก็ไม่ประสบความสำเร็จ จากนั้นฉันก็ลองใช้ProxyPassMatchคำสั่ง แต่ฉันก็ไม่สามารถแก้ไขให้ถูกต้องได้

นี่คือการกำหนดค่าปัจจุบันตามที่โหลดไว้/etc/apache2/sites-available/บนเว็บเซิร์ฟเวอร์ โปรดทราบว่ามีไดเรกทอรีรูปภาพที่โฮสต์ในเครื่อง ฉันยังคงปกป้องการใช้ประโยชน์พร็อกซี mod_rewriteและฉันกำลังระงับmod_securityกฎบางอย่างที่ให้ผลบวกปลอม

<VirtualHost *:80>
    ServerAdmin admin@drummer-server
    ServerName drummer-server

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /images/ "/var/www/images/"

    RewriteEngine On
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    ProxyPass /images !

    ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
    ProxyPassReverse / http://granny-server:8181/jellyfish

    ProxyPreserveHost On

    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

</VirtualHost>

ถ้าผมไปhttp://web-serverผมได้รับการเปลี่ยนเส้นทางไปhttp://web-server/jellyfish/homeแต่นี้จะช่วยให้ 404 ที่มีการร้องเรียนเกี่ยวกับการพยายามที่จะเข้าถึง/jellyfish/jellyfish/home- NB /jellyfishแถบที่อยู่ของเบราว์เซอร์ไม่ได้มีคู่

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

และถ้าผมไปhttp://web-server/loginผมได้รับการเปลี่ยนเส้นทางไปhttp://web-server/jellyfish/login?0แต่นี้จะช่วยให้ 404 /jellyfish/jellyfish/loginที่มีการร้องเรียนเกี่ยวกับการพยายามที่จะเข้าถึง

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

ดังนั้นฉันเดาว่าฉันผ่านกฎสองครั้ง ฉันรู้สึกสับสนเล็กน้อยกับที่มาของhomeบิตในตัวอย่างแรก

มีคนบอกฉันในทิศทางที่ถูกต้องได้ไหม

ขอบคุณเจ


ฉันมีความคืบหน้าเกี่ยวกับเรื่องนี้และตอนนี้ได้แทนที่ProxyPassMatchด้วยการใช้เทียบเท่าmod_rewriteซึ่งอยู่ที่ความท้าทายของการลบออกjellyfishจาก URL ตอนนี้ฉันกำลังพิจารณาจำนวน 404 วินาทีที่ปรากฏขึ้นมาเกี่ยวกับองค์ประกอบพื้นฐานเช่นองค์ประกอบของ Wicket ที่ Karaf ต้องการ นี่เป็นข้อมูลโค้ด:# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/
Jeremy Gooch

คำตอบ:


10

นี่คือวิธีที่ฉันได้มันไปทำงาน เช่นเดียวกับการเปลี่ยนแปลงตามความคิดเห็นของฉันกับคำถามเดิมของฉันฉันต้องยกเว้น.jsและ.cssจากกฎที่เพิ่มเครื่องหมายทับ

<VirtualHost *:80>
    ServerAdmin admin@localhost
    ServerName mydomain.com
    ServerAlias www.mydomain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteLog ${APACHE_LOG_DIR}/rewrite.log
    RewriteLogLevel 9

    Alias /images/ "/var/www/images/"

    RewriteEngine On

    # rewrite rule to prevent proxy exploit
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    # consolidate non-www requests onto the www subdomain
    RewriteCond  %{HTTP_HOST}    ^yourdomain\.com$
    RewriteRule  ^(.*)           http://www.yourdomain.com/$1  [R=301,L]

    # Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteCond  %{REQUEST_URI}  !^/(.*)(.js|.css)$
    RewriteCond  %{REQUEST_URI}  !(.*)/$
    RewriteRule  ^(.*)$          http://%{HTTP_HOST}$1/ [R=301,L]

    # proxy to the Jellyfish server (ignoring images)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteRule  ^(/.*)$         http://app-server:8181/jellyfish$1  [P]
    ProxyPassReverse  /          http://app-server:8181/jellyfish/

    # suppress mod_security rules that were giving false positives
    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

</VirtualHost>

1

คุณเคยลองไหม:

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

หรือมากกว่านั้นเพียงแค่:

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

ฉันเขียนถึงวิธีจัดการกับ Apache reverse proxying และ Tomcat ตรงนี้ถ้าคุณต้องการเปรียบเทียบ / เปรียบเทียบสิ่งที่คุณตั้งค่ากับสิ่งที่ฉันใช้

คุณอาจต้องการเพิ่มสิ่งนี้เพื่อเพิ่มเครื่องหมายสแลชต่อท้าย URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]

ขอบคุณมากสำหรับคำตอบ น่าเสียดายที่การทำเช่นนี้ช่วยแก้ไขปัญหาเฉพาะส่วนที่เป็นพร็อกซีได้เท่านั้น บิตฉันหายไปเป็นวิธีการที่จะลบคำว่า "แมงกะพรุน" จากการมองเห็นในแถบที่อยู่เบราว์เซอร์ของลูกค้าดังกล่าวที่http://web-serverเงียบได้รับ proxied ไปhttp://app-server:8181/jellyfishและกลับมาอีกครั้ง
Jeremy Gooch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.