如何配置特定于域的默认浏览器?

Mat*_*ice 9 default-programs

如果 url 匹配,.*\.myemployer\.com.*那么我希望链接以铬打开。否则我希望它勇敢地打开。这可能吗?如果是这样,如何?

Nat*_*ver 7

请注意,text/htmlmimetype(这是打开实际的 HTML 文件)和x-scheme-handler/httpmimetype(这是一个 HTTP URL)之间存在差异。我假设您想自定义外部应用程序如何打开 HTTP/HTTPS URL,因为您提到了域。(请注意,这是针对外部应用程序的。自定义特定浏览器如何处理 HTTP URL 是完全不同的事情。)

关于自定义 URL 处理程序的一件棘手的事情是关联可能存储在至少四个文件中,具体取决于应用程序使用的应用程序/库:

  • ~/.config/mimeapps.list (进行更改的正确位置)
  • ~/.local/share/application/mimeapps.list已弃用的位置
  • ~/.local/share/application/defaults.list(较旧的弃用位置
  • ~/.local/share/applications/mimeinfo.cache (缓存)

我最近一直在做一些关于自定义 URL 处理程序的工作 ,所以我为此目的调整了其中的一些。以下是说明:

  1. 检查协议的当前注册文件。在我看来,它们是这样的:

    $ gio mime x-scheme-handler/http
    Default application for “x-scheme-handler/http”: firefox.desktop
    Registered applications:
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            firefox.desktop
            chromium-browser.desktop
    $ gio mime x-scheme-handler/https
    Default application for “x-scheme-handler/https”: firefox.desktop
    Registered applications:
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            firefox.desktop
            chromium-browser.desktop
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写一个脚本来解析 URL 并启动相应的浏览器

    我更喜欢使用 Python,因为它具有解析 URL 并将错误发送到 syslog 的库。

    #! /usr/bin/env python3
    
    import subprocess
    import logging
    import argparse
    import syslog
    import sys
    
    try :
        from urllib.parse import urlparse
    except ImportError:
        from urlparse import urlparse
    import os.path
    
    def http_url(url):
        if url.startswith('http://'):
            return url
        if url.startswith('https://'):
            return url
        else:
            syslog.syslog(syslog.LOG_ERR, sys.argv[0] + ": not an HTTP/HTTPS URL: '{}'".format(url))
            raise argparse.ArgumentTypeError(
                "not an HTTP/HTTPS URL: '{}'".format(url))
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(
            description='Handler for http/https URLs.'
        )
        parser.add_argument(
            '-v',
            '--verbose',
            help='More verbose logging',
            dest="loglevel",
            default=logging.WARNING,
            action="store_const",
            const=logging.INFO,
        )
        parser.add_argument(
            '-d',
            '--debug',
            help='Enable debugging logs',
            action="store_const",
            dest="loglevel",
            const=logging.DEBUG,
        )
        parser.add_argument(
            'url',
            type=http_url,
            help="URL starting with 'http://' or 'https://'",
        )
        args = parser.parse_args()
        logging.basicConfig(level=args.loglevel)
        logging.debug("args.url = '{}'".format(args.url))
        parsed = urlparse(args.url)
        if parsed.hostname == 'askubuntu.com':
            browser = 'firefox'
        else:
            browser = 'chromium-browser'
        logging.info("browser = '{}'".format(browser))
        cmd = [browser, args.url]
        try :
            status = subprocess.check_call(cmd)
        except subprocess.CalledProcessError:
            syslog.syslog(syslog.LOG_ERR, sys.argv[0] + "could not open URL with browser '{}': {}".format(browser, args.url))
            raise
    
    Run Code Online (Sandbox Code Playgroud)

    根据您的喜好调整脚本,特别是部分中的可执行文件brave(我没有使用过,所以我不知道)和主机名if parsed.hostname

  3. 从当前目录测试脚本。

    这应该用 Firefox 打开:

    $ ./http_url_handler.py 'https://askubuntu.com/questions/1161752/how-can-i-configure-a-domain-specific-default-browser'
    
    Run Code Online (Sandbox Code Playgroud)

    这应该用 Chromium 打开:

    $ ./http_url_handler.py 'https://superuser.com/questions/688063/is-there-a-way-to-redirect-certain-urls-to-specific-web-browsers-in-linux/'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将脚本添加到您$PATH的桌面文件中,以便桌面文件可以找到它。

    我使用这样的bin目录:

    $ mkdir ~/bin/
    
    Run Code Online (Sandbox Code Playgroud)

    并将其添加到~/.profile (请注意,您需要注销并再次登录才能查看更改):

    PATH="$HOME/bin:$PATH"
    
    Run Code Online (Sandbox Code Playgroud)

    最后将脚本复制或符号链接到~/bin

    $ ln -s $PWD/http_url_handler.py ~/bin/
    
    Run Code Online (Sandbox Code Playgroud)

    如果您正确执行此操作,您应该会看到:

    $ type -a http_url_handler.py 
    http_url_handler.py is /home/nathaniel/bin/http_url_handler.py
    
    Run Code Online (Sandbox Code Playgroud)

    不是这个:

    $ type -a http_url_handler.py 
    bash: type: http_url_handler.py: not found
    
    Run Code Online (Sandbox Code Playgroud)
  5. 从您的主目录测试脚本。

    这应该在 Chromium 中打开:

    $ http_url_handler.py 'https://superuser.com/questions/688063/is-there-a-way-to-redirect-certain-urls-to-specific-web-browsers-in-linux'
    
    Run Code Online (Sandbox Code Playgroud)

    这应该在 Firefox 中打开:

    $ http_url_handler.py 'https://askubuntu.com/questions/1161752/how-can-i-configure-a-domain-specific-default-browser'
    
    Run Code Online (Sandbox Code Playgroud)
  6. 安装桌面文件。这是我使用一个

    [Desktop Entry]
    Name=HTTP URL handler
    Comment=Open an HTTP/HTTPS URL with a particular browser
    TryExec=http_url_handler.py
    Exec=http_url_handler.py %u
    X-MultipleArgs=false
    Type=Application
    Terminal=false
    NoDisplay=true
    MimeType=x-scheme-handler/http;x-scheme-handler/https
    
    Run Code Online (Sandbox Code Playgroud)

    要么通过desktop-file-install

    $ desktop-file-install --dir=$HOME/.local/share/applications/ http-url-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    或手动将http-url-handler.desktop文件复制到正确的目录,该目录应该是~/.local/share/applications/

    $ cp http-url-handler.desktop ~/.local/share/applications/
    
    Run Code Online (Sandbox Code Playgroud)

    这些是桌面文件中最重要的行:

    Exec=http_url_handler.py %u
    MimeType=x-scheme-handler/http;x-scheme-handler/https
    
    Run Code Online (Sandbox Code Playgroud)
  7. 使桌面文件可执行。

    $ chmod +x $HOME/.local/share/applications/http-url-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    由于安全预防措施,这是必要的

  8. 使用x-scheme-handler/httpx-scheme-handler/httpsmimetypes注册桌面文件 。

    $ gio mime x-scheme-handler/http  http-url-handler.desktop
    Set http-url-handler.desktop as the default for x-scheme-handler/http
    $ gio mime x-scheme-handler/https http-url-handler.desktop
    Set http-url-handler.desktop as the default for x-scheme-handler/https
    
    Run Code Online (Sandbox Code Playgroud)

    所有这些真正做的是更改组~/.config/mimeapps.list 下的行[Default Applications],而不是这样:

    x-scheme-handler/http=firefox.desktop
    x-scheme-handler/https=firefox.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    它说:

    x-scheme-handler/http=http-url-handler.desktop
    x-scheme-handler/https=http-url-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    您还可以[Added Associations]使用文本编辑器将其添加到组下,使其看起来像这样:

    x-scheme-handler/http=http-url-handler.desktop;firefox.desktop;chromium-browser.desktop
    x-scheme-handler/https=http-url-handler.desktop;firefox.desktop;chromium-browser.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    一些较旧的应用程序使用~/.local/share/application/mimeapps.list,但这是正式弃用的。但是,该xdg-mime命令无论如何都会使用此位置:

    $ xdg-mime default http-url-handler.desktop x-scheme-handler/http
    $ xdg-mime default http-url-handler.desktop x-scheme-handler/https
    
    Run Code Online (Sandbox Code Playgroud)

    还有一个更老的过时的文件 被称为defaults.list 是仍在使用的一些应用程序。使用文本编辑器编辑此文件:

    $ edit ~/.local/share/applications/defaults.list
    
    Run Code Online (Sandbox Code Playgroud)

    并手动添加这些行:

    x-scheme-handler/http=http-url-handler.desktop
    x-scheme-handler/https=http-url-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    [Default Applications]组。

  9. 检查是否注册成功。

    $ gio mime x-scheme-handler/http
    Default application for “x-scheme-handler/http”: http-url-handler.desktop
    Registered applications:
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            firefox.desktop
            chromium-browser.desktop
    $ gio mime x-scheme-handler/https
    Default application for “x-scheme-handler/https”: http-url-handler.desktop
    Registered applications:
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            firefox.desktop
            chromium-browser.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    如果您还添加到该[Added Associations]组,它将如下所示:

    $ gio mime x-scheme-handler/http
    Default application for “x-scheme-handler/http”: http-url-handler.desktop
    Registered applications:
            http-url-handler.desktop
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            http-url-handler.desktop
            firefox.desktop
            chromium-browser.desktop
    $ gio mime x-scheme-handler/https
    Default application for “x-scheme-handler/https”: http-url-handler.desktop
    Registered applications:
            http-url-handler.desktop
            firefox.desktop
            chromium-browser.desktop
    Recommended applications:
            http-url-handler.desktop
            firefox.desktop
            chromium-browser.desktop
    
    Run Code Online (Sandbox Code Playgroud)

    检查xdg-mime也。

    $ xdg-mime query default x-scheme-handler/http
    http-url-handler.desktop
    $ xdg-mime query default x-scheme-handler/https
    http-url-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)
  10. 测试一些 URL。

    这应该在 Chromium 中打开:

    $ gio open 'https://superuser.com/questions/688063/is-there-a-way-to-redirect-certain-urls-to-specific-web-browsers-in-linux'
    
    Run Code Online (Sandbox Code Playgroud)

    这应该在 Firefox 中打开:

    $ gio open 'https://askubuntu.com/questions/1161752/how-can-i-configure-a-domain-specific-default-browser'
    
    Run Code Online (Sandbox Code Playgroud)

    现在使用以下命令测试相同的 URL xdg-open

    $ xdg-open 'https://superuser.com/questions/688063/is-there-a-way-to-redirect-certain-urls-to-specific-web-browsers-in-linux/'
    
    $ xdg-open 'https://askubuntu.com/questions/1161752/how-can-i-configure-a-domain-specific-default-browser'
    
    Run Code Online (Sandbox Code Playgroud)
  11. 更新 mimeinfo 缓存。

    某些应用程序读取~/.local/share/applications/mimeinfo.cache 而不是~/.config/mimeapps.list. 所以更新缓存:

    $ update-desktop-database ~/.local/share/applications/
    
    Run Code Online (Sandbox Code Playgroud)

为方便起见,这些文件在 Github 上:

https://github.com/nbeaver/askubuntu-custom-http-url-handler