रिवर्स प्रॉक्सी में अपाचे यूआरएल पुनर्लेखन


12

मैं अपाचे को एक Karaf द्वारा होस्ट किए गए एप्लिकेशन के सामने तैनात कर रहा हूं (Apache और Karaf अलग-अलग सर्वर पर हैं)। मैं चाहता हूं कि अपाचे एक रिवर्स प्रॉक्सी के रूप में काम करे और यूआरएल के हिस्से को भी छिपाए।

एप्लिकेशन सर्वर से सीधे एप्लिकेशन के लॉग-इन पृष्ठ प्राप्त करने के लिए URL है http://app-server:8181/jellyfish। करफ के भीतर चल रहे जेट्टी उदाहरण द्वारा पृष्ठ परोसे जाते हैं। बेशक, यह व्यवहार आमतौर पर रिवर्स प्रॉक्सी सर्वर को छोड़कर सब कुछ के लिए फ़ायरवॉल द्वारा अवरुद्ध किया जाएगा।

फ़ायरवॉल बंद होने पर, यदि आप इस URL को हिट करते हैं तो जेट्टी लॉग-इन पृष्ठ को लोड करता है। ब्राउज़र का पता बार सही तरीके से बदलता है http://app-server:8181/jellyfish/login?0और सब कुछ काम करता है।

जो मैं चाहता हूं http://web-server(रूट से यानी) के लिए ऐप सर्वर पर जेट्टी से मैप करने के लिए ऐप के नाम के साथ ( jellyfish) दबा हुआ है। उदा। http://web-server/login?0पता बार में ब्राउज़र दिखाने के लिए बदल जाएगा और बाद के सभी यूआरएल और सामग्री वेब-सर्वर के डोमेन और jellyfishअव्यवस्था के बिना सेवा की जाएगी ।

मैं निम्नलिखित विन्यास (स्निपेट) का उपयोग करके अपाचे को एक साधारण रिवर्स प्रॉक्सी के रूप में संचालित कर सकता हूं: -

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- नायब ब्राउज़र के एड्रेस बार में डबल नहीं है /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कि पहले उदाहरण में URL कहां से आया है।

क्या कोई मुझे सही दिशा की और संकेत करने में सक्षम है?

धन्यवाद, जे।


मैंने इस पर कुछ प्रगति की है, और अब इसे ProxyPassMatchएक समकक्ष उपयोग के साथ बदल दिया है mod_rewrite, जो jellyfishयूआरएल से हटाने की चुनौती को संबोधित करता है । मैं अब 404 की संख्या में देख रहा हूं जो तब करफ द्वारा आवश्यक विकेट घटकों जैसे अंतर्निहित तत्वों के संबंध में पॉप अप करता है। यहाँ एक कोड स्निपेट है:# 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/
जेरेमी गूच

जवाबों:


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/

मैंने लिखा है कि मैं कैसे अपाचे रिवर्स प्रॉक्सिमिंग और टॉमकैट से निपटता हूं अगर आप क्या उपयोग करते हैं इसके साथ तुलना करना चाहते हैं।

आप 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चुपचाप http://app-server:8181/jellyfishफिर से और वापस हो जाता है ।
जेरेमी गूच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.