سؤال

لدي حاليا إعداد خادم HTTP Tomcat + Apache لخدمة Servlet Java:

ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice

هذا كل شيء على ما يرام إلا myservice يحتاج إلى معرفة عنوان IP العميل، الذي يتحول دائما إلى 127.0.0.1 بسبب الوكيل. هل هناك حل للحصول على عنوان IP الحقيقي؟ هل AJP خيار؟

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
هل كانت مفيدة؟

المحلول

هل مثل هذا:

في التكوين Apache:

<Location /foo>
  ProxyPass ajp://localhost:8009/foo
  ProxyPassReverse ajp://localhost:8009/foo
</Location>

ثم في Server.xml:

<Connector port="8009" 
           enableLookups="false" secure="true" URIEncoding="UTF-8"
           tomcatAuthentication="false"
           protocol="AJP/1.3" />

يجب أن يمر كل شيء من خلال. بروتوكول AJP يمر المعلومات، ولكن http: لا.

قد لا ترغب في الحصول على آمنة = "True"، وأنا استخدم ذلك لأن SSL يتم التعامل معها في طبقة Apache وأحتاج إلى Tomcat لمعرفة أن الاتصال يجب أن يعتبر واحدا آمنا.

نصائح أخرى

يمكنك قراءة X-Forended-for في رأس الطلب.

من وثائق Apache Mod_Proxy:

عند التمثيل في وضع وكيل عكسي (باستخدام التوجيه ProxyPass، على سبيل المثال)، يضيف MOD_PROXY_HTTP العديد من رؤوس الطلبات من أجل تمرير المعلومات إلى خادم الأصل. هذه الرؤوس هي:

  • X- إعادة توجيه-ل: عنوان IP للعميل.
  • X- إعادة توجيه المضيف: المضيف الأصلي المطلوب من قبل العميل في رأس طلب HTTP المضيف.
  • خادم X- إعادة توجيه: اسم المضيف للخادم الوكيل.

كن حذرا عند استخدام هؤلاء الرؤوس على خادم الأصل، نظرا لأنهم سيحتويون على أكثر من قيمة واحدة (مفصولة بفواصل) إذا كان الطلب الأصلي يحتوي بالفعل على واحد من هؤلاء الرؤوس. على سبيل المثال، يمكنك استخدام٪ {X - إعادة توجيهها - ل} i في سلسلة تنسيق السجل من خادم الأصل لتسجيل عنوان IP للعملاء الأصليين، ولكن قد تحصل على أكثر من عنوان واحد إذا تم تمرير الطلب عبر عدة وكلاء.

في سيرله الخاص بك، سيكون لديك:

doGet(HttpServletRequest request, HttpServletResponse response){
  request.getHeader("X-Forwarded-For")
}

هذا بسيط جدا:

<VirtualHost> 

 ServerName www.server.com

 redirect / http://www.server.com/foo

 ProxyRequests off
 ProxyPass / ajp://localhost:8009/

</VirtualHost>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top