Có thể thay thế nội dung trên mỗi trang được truyền qua proxy tương tự như cách mod_rewrite được sử dụng cho URL không?


11

Có thể thay thế nội dung trên mỗi trang được truyền qua proxy tương tự như cách mod_rewrite được sử dụng cho URL không? Các tài liệu về thay thế là không rõ ràng.

Tôi có một số trang tôi đang ủy quyền ngược có đường dẫn tuyệt đối. Điều này phá vỡ trang web. Họ cần thay thế và các công cụ như mod_rewrite không chọn chúng vì chúng không phải là yêu cầu 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>

Cả hai cách trên đều không thay thế chuỗi HTML

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

với

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

Conf sau khi thay đổi:

<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>

Tôi bối rối. Trông giống như từ athẻ HTML . Nhấp vào liên kết đó có thể sẽ không dẫn đến trình duyệt web theo liên kết mà thay vào đó là trình duyệt tệp (Windows Explorer) đang cố mở UNC. Bạn đang cố gắng thay thế chuỗi đó trong văn bản HTML?
GregL

Họ trang web hoạt động chính xác. Tuy nhiên, một khi chúng tôi đặt nó phía sau tường lửa, chúng tôi sẽ nhận được 404 trên một loạt các css và hình ảnh. Thông thường mọi thứ sẽ nhận được 200
ZZ9

Họ là những từ thẻ liên kết trên một máy chủ IIS <link href = "// FQDN / tài sản"
ZZ9

Tôi không nghĩ bạn có thể cung cấp đường dẫn UNC trong linkthẻ. Nếu bạn có thể, tôi không thể nói đó sẽ là một ý tưởng hay .. Trong mọi trường hợp, đó không phải là câu hỏi của bạn. Theo các tài liệu của Apache , lệnh substitutenày chỉ có hiệu lực trong Directorycác khối hoặc .htaccesstệp. Hãy thử tạo một <location>khối (ngay cả khi nó cho /) và đặt lệnh vào đó.
GregL

2
@GregL, định dạng URL này là URL "liên quan đến giao thức", đây là cách hoàn toàn hợp lệ để liên kết đến các trang, mặc dù nó không được biết đến phổ biến. "//domain.com/path" làm cho trình duyệt yêu cầu tài liệu có cùng giao thức được sử dụng để yêu cầu trang chứa liên kết.
Tero Kilkanen

Câu trả lời:


11

Có một mô-đun apache gọi là mod_substolarship có thể làm điều này. Đây là một ví dụ ngắn:

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

Hoặc, khi kết hợp với 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"

Có thêm thông tin tại tài liệu Apache cho mod_substolarship .


Xin chào, cảm ơn vì lời đề nghị, tiếc là tôi không gặp nhiều may mắn trong con đường này. Tôi đã thử nghiệm nó bên ngoài proxy thành công mặc dù. Nó xuất hiện mod_proxy bỏ qua nó.
ZZ9

Tôi đã thêm một số thông tin có thể hữu ích.
Jenny D

1
Cảm ơn rất nhiều, điều này làm việc. Hóa ra là một trục trặc với việc Apache chọn các bản sao lưu các tệp của tôi trong /etc/httpd/conf.d/ không kết thúc bằng .conf (vhost.bak).
ZZ9

7

Nếu bạn chưa khởi động lại Apache, hãy chắc chắn làm điều đó, nhưng nếu bạn đã làm như vậy, bạn có thể thử bộ lọc đầu ra toàn cầu chạy tập lệnh PHP tùy chỉnh để thay thế bạn chỉ vì lý do đó giải quyết nó vì lý do nào đó .

EDIT: dựa trên nhận xét của bạn, có thể thay thế đó không hoạt động vì nội dung bị nén. Để tắt tính năng nén, hãy thêm các dòng này vào Virtualhost của bạn:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Nếu điều đó không hiệu quả, hãy thử như sau:

Thêm chúng vào conf của bạn, cập nhật các đường dẫn của khóa học:

#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

Trong proxyfilter.php có một số mã như sau:

#!/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);

Nếu điều này hoạt động, thì hãy thu hẹp trọng tâm của điều này thành chỉ nội dung văn bản / html như bạn có trong ví dụ của mình.


Tôi nhận được HTML 200 trên trang nhưng trình duyệt hiển thị: Lỗi mã hóa nội dung Trang bạn đang cố xem có thể được hiển thị vì nó sử dụng hình thức nén không hợp lệ hoặc không được hỗ trợ.
ZZ9

Ah, thêm chúng vào Virtualhost của bạn. RequestHeader bỏ đặt Mã hóa chấp nhận và cũng Bộ yêu cầu Bộ nhận dạng mã hóa chấp nhận
g491

Tôi đã cập nhật câu trả lời của mình với một cái gì đó để cố gắng làm cho dòng thay thế ban đầu của bạn hoạt động. Tôi khuyên bạn nên thử điều đó trước tiên vì nó đơn giản hơn để thử và có thể là những gì đang diễn ra.
g491

Cập nhật cho một câu trả lời tuyệt vời nhưng tôi đã nhận được câu trả lời khác hoạt động trước
ZZ9

1
Trong trường hợp của tôi, đó là nén, đóng đinh nó. Nó làm tôi phát điên ... cảm ơn bạn rất nhiều!
chàng người Brazil đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.