Athlon1600 / php-proxy

A web proxy script written in PHP and built as an alternative to Glype.
https://www.php-proxy.com
MIT License
298 stars 158 forks source link

proxifying all the relative links does not always work #29

Closed domsie closed 7 years ago

domsie commented 8 years ago

Hi,

I just realized that not all relative urls set correctly. Some relative urls are then hung on the 'Proxy URL'.

For example: [call the website http://bild.de via an instance of php-proxy] 404 error => http://[proxy-url.de]/community/static/ajax/numcoms/47270604:47289584

this file must be call via http://bild.de/community/static/ajax/numcoms/47270604:47289584

Can this be because "HeaderRewritePlugin.php" explicitly asks if there is a value for header->location set and only when set sets a "proxify_url"?

HeaderRewritePlugin.php

        // proxify header location value
        if($response->headers->has('location')){

            $location = $response->headers->get('location');

            // just in case this is a relative url like: /en
            $response->headers->set('location', proxify_url($location, $request_url));
        }

ProxifyPlugin.php

    public function onCompleted(ProxyEvent $event){

    // to be used when proxifying all the relative links
    $this->base_url = $event['request']->getUri();
domsie commented 8 years ago

one problem is when the website loads scripts "on other ways" than the ProxifyPlugin.php wants to replace the sources for relative urls via certain regex expressions:

e.g.: chip.de loads some scripts so: [www.chip.de/Downloads_13649224.html]

<script type="text/javascript" src="/js/_merged/efws.js?t=48766"></script>
<script type="text/javascript">
EFWS.Script.loadScripts([
'/js/_merged/jQuery.js?t=61946',
'/js/_merged/jQueryUI.js?t=60289',
'/js/_merged/global.js?t=64771',
'/js/_merged/navseiten.js?t=60257'], '');
</script>
domsie commented 7 years ago

made following changes at proxifyplugin.php to set the url path from relativ to absolute within ajax calls:

` $request_uri = $this->base_url; $tmp = parse_url($this->base_url); $base_host = $tmp['scheme'].'://'.$tmp['host']; if (substr($base_host, -1) !== '/') { $base_host = $base_host.'/'; } $base_host_unencoded = $base_host;

    $jquery  = '<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous" type="text/javascript"></script>';
    $jquery .= '<script type="text/javascript">';
    $jquery .= 'var jQuery_atp = jQuery.noConflict(true);';
    $jquery .= '(function ($) {';
    $jquery .= 'var baseHref = $("head base").attr("href");';
    $jquery .= '$.ajaxSetup({';
    $jquery .= 'beforeSend: function(xhr, options) {';
    $jquery .= 'options.url = baseHref + options.url;';
    $jquery .= '}';
    $jquery .= '});';
    $jquery .= '}(jQuery_atp));';
    $jquery .= '</script>';

    $str = str_replace('</title>','</title><base href="'.$base_host_unencoded.'" />'.$jquery,$str);
    $response->setContent($str);` 
Athlon1600 commented 7 years ago

So is everything okay from your side now? Because I don't see any errors myself when I visit bild.de apart from those created by "EFWS.Script.loadScripts(["