เป็นไปได้หรือไม่ที่จะแทนที่เนื้อหาในทุก ๆ หน้าผ่านพร็อกซีคล้ายกับวิธีที่ mod_rewrite ใช้สำหรับ URL?


11

เป็นไปได้หรือไม่ที่จะแทนที่เนื้อหาในทุก ๆ หน้าผ่านพร็อกซีคล้ายกับวิธีที่ mod_rewrite ใช้สำหรับ URL? เอกสารเกี่ยวกับการทดแทนไม่ชัดเจน

ฉันมีบางหน้าฉันย้อนกลับพร็อกซีที่มีเส้นทางที่แน่นอน สิ่งนี้จะทำลายเว็บไซต์ พวกเขาต้องการการแทนที่และเครื่องมือเช่น mod_rewrite ไม่ได้มารับมันเนื่องจากไม่ใช่การร้องขอ URL

<VirtualHost *:80>
    ServerName  servername1
    ServerAlias servername2

    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common

    RewriteEngine on
    LogLevel alert rewrite:trace2
    RewriteCond %{HTTP_HOST} /uat.site.co.jp$ [NC]
    RewriteRule ^(.*)$ http://jp.uat.site2uk.co.uk/$1 [P]

    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|i"


    ProxyRequests Off

    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
</VirtualHost>

ไม่สามารถใช้งานได้กับการแทนที่สตริง HTML

<link href="/server///uat.site.co.jp/css/css.css

กับ

<link href="/server///uat.site2uk.co.uk/css/css.css

Conf หลังจากการเปลี่ยนแปลง:

<VirtualHost *:80>
    ServerName  jp.uat.site2uk.co.uk
    ServerAlias uat.site.co.jp
    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|ni"
</VirtualHost>

ฉันสับสน ดูเหมือนว่ามาจากaแท็กHTML การคลิกที่ลิงก์นั้นอาจไม่ส่งผลให้เว็บเบราว์เซอร์ติดตามลิงก์ แต่เป็นไฟล์เบราว์เซอร์ (Windows Explorer) ที่พยายามเปิด UNC คุณพยายามแทนที่สตริงนั้นในข้อความ HTML หรือไม่
GregL

เว็บไซต์ทำงานอย่างถูกต้อง อย่างไรก็ตามเมื่อเราวางมันไว้หลังไฟร์วอลล์เราจะได้รับ 404s บนเครือ css และรูปภาพ โดยปกติทุกอย่างจะได้รับ 200
ZZ9

พวกเขามาจากลิงค์แท็กบนเซิร์ฟเวอร์ IIS <link href = "// fqdn / asset"
ZZ9

ฉันไม่คิดว่าคุณสามารถให้เส้นทาง UNC ในlinkแท็ก ถ้าคุณทำได้ฉันไม่สามารถบอกได้ว่ามันเป็นความคิดที่ดี .. ไม่ว่าในกรณีใดนั่นไม่ใช่คำถามของคุณ ตามที่ Apache เอกสารที่substituteสั่งจะใช้ได้เฉพาะภายในDirectoryบล็อกหรือ.htaccessไฟล์ ลองสร้าง<location>บล็อก (แม้ว่าจะใช้สำหรับ /) และวางคำสั่งไว้ในนั้น
GregL

2
@GregL รูปแบบของ URL นี้เป็น URL "ที่สัมพันธ์กับโพรโทคอล" ซึ่งเป็นวิธีที่สมบูรณ์แบบในการลิงก์ไปยังหน้าต่างๆแม้ว่าจะไม่เป็นที่รู้จักกันทั่วไปก็ตาม "//domain.com/path" ทำให้เบราว์เซอร์ร้องขอเอกสารด้วยโปรโตคอลเดียวกันกับที่ใช้ในการร้องขอหน้าเว็บที่มีลิงค์
Tero Kilkanen

คำตอบ:


11

มีโมดูล apache ชื่อ mod_substitute ซึ่งสามารถทำได้ นี่เป็นตัวอย่างสั้น ๆ :

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s/uat.site.co.jp/jp.uat.site2uk.co.uk/ni"
</Location>

หรือเมื่อรวมกับ mod_proxy:

ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/

Substitute "s|http://uat.site.co.jp/|http://jp.uat.site2uk.co.uk/|i"

มีข้อมูลเพิ่มเติมที่เป็นเอกสาร Apache สำหรับ mod_substitute


สวัสดีขอบคุณสำหรับคำแนะนำโชคไม่ดีที่ฉันยังไม่ได้โชคดีในเส้นทางนี้ ฉันได้ทำการทดสอบนอกพร็อกซีเรียบร้อยแล้ว ดูเหมือนว่า mod_proxy จะข้ามไป
ZZ9

ฉันเพิ่มข้อมูลเพิ่มเติมซึ่งอาจเป็นประโยชน์
เจนนี่ D

1
ขอบคุณมากมันใช้งานได้ดี กลายเป็นข้อผิดพลาดกับ Apache ที่เก็บสำรองข้อมูลไฟล์ของฉันใน /etc/httpd/conf.d/ ที่ไม่ได้ลงท้ายด้วย. conf (vhost.bak)
ZZ9

7

หากคุณยังไม่ได้รีสตาร์ท Apache อย่าลืมทำเช่นนั้น แต่ถ้าคุณได้ทำไปแล้วคุณสามารถลองใช้ตัวกรองเอาต์พุตทั่วโลกที่รันสคริปต์ PHP แบบกำหนดเองเพื่อแทนที่ตัวคุณเองเพื่อดูว่าแก้ด้วยเหตุผลบางอย่างได้ไหม .

แก้ไข: ตามความคิดเห็นของคุณอาจเป็นไปได้ว่าการแทนที่ไม่ทำงานเนื่องจากเนื้อหาถูกบีบอัด หากต้องการปิดการบีบอัดให้เพิ่มบรรทัดเหล่านี้ใน VirtualHost ของคุณ:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

หากวิธีนี้ใช้ไม่ได้ผลให้ลองทำดังนี้:

เพิ่มสิ่งเหล่านี้ลงใน conf ของคุณอัปเดตเส้นทางของหลักสูตร:

#add this outside of any VirtualHost tags
ExtFilterDefine proxiedcontentfilter mode=output cmd="/usr/bin/php /var/www/proxyfilter.php"

#add these in your VirtualHost tag
RequestHeader unset Accept-Encoding 
RequestHeader set Accept-Encoding identity
SetOutputFilter proxiedcontentfilter

ใน proxyfilter.php มีรหัสบางอย่างดังต่อไปนี้:

#!/usr/bin/php
<?php
$html = file_get_contents('php://stdin');
$html = str_ireplace('uat.site.co.jp', 'jp.uat.site2uk.co.uk', $html);
file_put_contents('php://stdout', $html);

หากวิธีนี้ใช้งานได้ให้ จำกัด จุดเน้นของสิ่งนี้เป็นเพียงข้อความ / เนื้อหา HTML ตามที่คุณมีในตัวอย่าง


ฉันได้รับ HTML 200 บนหน้าเว็บ แต่เบราว์เซอร์แสดง: ข้อผิดพลาดในการเข้ารหัสเนื้อหาหน้าเว็บที่คุณพยายามดูไม่สามารถแสดงได้เพราะมันใช้รูปแบบการบีบอัดที่ไม่ถูกต้องหรือไม่ได้รับการสนับสนุน
ZZ9

อ่าเพิ่มสิ่งเหล่านี้ไปยัง VirtualHost ของคุณ RequestHeader unset ยอมรับการเข้ารหัสและยัง RequestHeader ชุดยอมรับการเข้ารหัสข้อมูลประจำตัว
g491

ฉันได้อัปเดตคำตอบของฉันพร้อมกับบางสิ่งเพื่อพยายามให้บรรทัดการทดแทนเดิมทำงาน ฉันขอแนะนำให้ลองก่อนเป็นเรื่องง่ายกว่าที่จะลองและอาจเป็นสิ่งที่เกิดขึ้น
g491

อัปเดตสำหรับคำตอบที่ดี แต่ฉันได้รับคำตอบอื่น ๆ ก่อน
ZZ9

1
ในกรณีของฉันมันคือการบีบอัดเอาไว้ มันทำให้ฉันบ้า ... ขอบคุณมาก!
Guy บราซิลนั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.