nginx 子路径 网站图片或js/css 路径缺失 替换

 

nginx 子路径 网站图片或js/css 路径缺失 替换

location /test {
        rewrite ^/test/(.*)$ /$1 break;
        proxy_pass http://localhost:8080;
        sub_filter_types *;
        sub_filter '/Content/' '/test/Content/';#将Content加上前缀test
        sub_filter '/Assets/' '/test/Assets/';#将Assets加上前缀test
        sub_filter_once off;
    }

 

location /jp/ {
        proxy_pass http://127.0.0.1:4447/;
        
        # 关键:传递原始信息给 ASP.NET
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Prefix /jp;  # 告诉应用它在子目录下
        
        # 处理 ASP.NET 的重定向(如登录跳转、ReturnUrl)
        proxy_redirect / /jp/;
        
        # 2. sub_filter 修正 HTML 内容中的绝对路径
        sub_filter_types *;
        sub_filter_once off;
        
        # 替换常见的根路径引用(注意顺序,避免冲突)
        sub_filter 'href="/' 'href="/jp/';
        sub_filter 'src="/' 'src="/jp/';
        sub_filter 'url(/' 'url(/jp/';
        sub_filter '/Content/' '/jp/Content/';
        sub_filter '/Assets/' '/jp/Assets/';
        
        # 3. 如果 ASP.NET 返回了压缩内容,需要先解压再过滤
        proxy_set_header Accept-Encoding "";
    }
        window.__appBase = '@System.Configuration.ConfigurationManager.AppSettings["AppBasePath"]' || '';
        jQuery(document).ready(function () {
            // initiate layout and plugins
            App.init();
        });

        (function(base) {
    if (!base) return; // 根目录部署时直接跳过
    
    function fixUrl(url) {
        if (typeof url !== 'string') return url;
        if (/^https?:\/\//i.test(url) || url.indexOf('//') === 0) return url; // 完整URL
        if (url.charAt(0) !== '/') return url;                               // 相对路径
        if (url.indexOf(base) === 0) return url;                             // 已有前缀
        return base + url;
    }
    
    // ========== 1. 拦截 jQuery AJAX(覆盖 easyui/datagrid/treegrid 等所有组件)==========
    if (window.jQuery) {
        jQuery.ajaxPrefilter(function(options) {
            if (options.url) {
                options.url = fixUrl(options.url);
            }
        });
        
        // 同时拦截 $.fn.attr 的 href/src/action(处理面包屑、链接、表单等)
        var originalAttr = jQuery.fn.attr;
        jQuery.fn.attr = function(name, value) {
            if (arguments.length > 1 && typeof value === 'string' 
                && (name === 'href' || name === 'src' || name === 'action')) {
                arguments[1] = fixUrl(value);
            }
            return originalAttr.apply(this, arguments);
        };
        
        // 页面加载完成后,修正已有的静态元素
        jQuery(function($) {
            $('a[href^="/"], img[src^="/"], link[href^="/"], script[src^="/"], form[action^="/"]').each(function() {
                var $el = $(this);
                if ($el.is('a')) $el.attr('href', fixUrl($el.attr('href')));
                else if ($el.is('img, script')) $el.attr('src', fixUrl($el.attr('src')));
                else if ($el.is('link')) $el.attr('href', fixUrl($el.attr('href')));
                else if ($el.is('form')) $el.attr('action', fixUrl($el.attr('action')));
            });
        });
    }
    
    // ========== 2. 拦截原生 XMLHttpRequest(兜底,防止组件绕过 jQuery)==========
    if (window.XMLHttpRequest) {
        var originalOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function(method, url) {
            // 注意:arguments 是类数组,不能直接修改,需要重新调用
            var args = Array.prototype.slice.call(arguments);
            args[1] = fixUrl(url);
            return originalOpen.apply(this, args);
        };
    }
    
    // ========== 3. 拦截 fetch API(现代浏览器,部分新组件可能用)==========
    if (window.fetch) {
        var originalFetch = window.fetch;
        window.fetch = function(input, init) {
            if (typeof input === 'string') {
                input = fixUrl(input);
            } else if (input instanceof Request) {
                var newUrl = fixUrl(input.url);
                if (newUrl !== input.url) {
                    input = new Request(newUrl, input);
                }
            }
            return originalFetch.call(this, input, init);
        };
    }
    
    // ========== 4. MutationObserver 监听 JS 动态插入的 DOM(面包屑等)==========
    if (window.MutationObserver && window.jQuery) {
        jQuery(function($) {
            var observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                    $(mutation.addedNodes)
                        .find('a[href^="/"], img[src^="/"], link[href^="/"], script[src^="/"]')
                        .addBack('a[href^="/"], img[src^="/"], link[href^="/"], script[src^="/"]')
                        .each(function() {
                            var $el = $(this);
                            var val = $el.is('a') ? $el.attr('href') : $el.attr('src');
                            if (val && val.charAt(0) === '/' && val.indexOf(base) !== 0) {
                                $el.is('a') ? $el.attr('href', base + val) : $el.attr('src', base + val);
                            }
                        });
                });
            });
            if (document.body) {
                observer.observe(document.body, { childList: true, subtree: true });
            }
        });
    }
})(window.__appBase);

 

    <!-- 子目录部署时:value="/jp" -->
    <!-- 根目录部署时:value="" -->
    <add key="AppBasePath" value="/jp" />

 

posted @ 2023-01-31 15:01  三瑞  阅读(427)  评论(0)    收藏  举报