如何在ubuntu DigitalOcean上配置Apache2以正确重定向除一条路径外的所有路径

如何在ubuntu DigitalOcean上配置Apache2以正确重定向除一条路径外的所有路径,ubuntu,redirect,mod-rewrite,apache2,Ubuntu,Redirect,Mod Rewrite,Apache2,我正在尝试在运行DigitalOcean droplet的Ubunti操作系统上设置Apache2,以便: 如果路径具有此模式:https://example.com/api,继续请求。无需重定向 对于所有其他路径,重定向到https://web.example.com 在这两种情况下,都需要保留request/post/headers/其他参数 我目前有这个,但它不工作 <IfModule mod_ssl.c> <VirtualHost *:443> S

我正在尝试在运行DigitalOcean droplet的Ubunti操作系统上设置Apache2,以便:

  • 如果路径具有此模式:
    https://example.com/api
    ,继续请求。无需重定向
  • 对于所有其他路径,重定向到
    https://web.example.com
  • 在这两种情况下,都需要保留request/post/headers/其他参数
  • 我目前有这个,但它不工作

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
            ServerName example.com
            ServerAlias www.example.com
            SSLProxyEngine on
            DocumentRoot /var/www/example/public
            RewriteEngine  on
            RewriteCond %{REQUEST_URI} !^/api$
            RewriteRule ^(.*)$  https://web.example.com/$1  [R=301,L]
    #SSL certificate stuff here
    </VirtualHost>
    </IfModule>
    
    
    ServerName example.com
    ServerAlias www.example.com
    SSLProxyEngine打开
    DocumentRoot/var/www/example/public
    重新启动发动机
    重写cond%{REQUEST_URI}^/原料药$
    重写规则^(.*)$https://web.example.com/$1[R=301,L]
    #SSL证书的东西在这里
    
    你没有明确说明这是什么或如何不起作用的。然而,这里有几个问题

  • 301(永久)重定向不会从初始请求中保留请求方法。浏览器将对重定向的请求发出GET请求,因此在POST请求的情况下,任何POST数据都将丢失。您需要使用307(临时)或308(永久)响应代码来保留请求方法

    但请注意,301(和308)响应由浏览器持久缓存。因此,您需要在测试之前清除浏览器缓存(以及任何中间缓存)

  • 由于这些指令直接位于
    容器中(与
    块或
    .htaccess
    相反),这将导致URL路径开始处出现双斜杠,因为URL路径与
    重写规则
    模式匹配(您将完整捕获该模式)包括完整的根相对URL路径,以斜杠开头

  • 请求/发布/标题/其他参数需要保留

    不确定您在这里的确切意思,但不一定能够通过重定向保留所有“标题”,因为这毕竟完全由浏览器决定

    您只能告诉浏览器要重定向到的新URL(作为HTTP响应头的一部分)和HTTP状态代码,以指示浏览器应如何处理响应

    请尝试以下操作:

    RewriteRule !^/api https://web.example.com%{REQUEST_URI} [R=307,L]
    
    不需要额外的
    RewriteCond
    指令,因为在
    RewriteRule
    指令本身中可以更容易(更有效)执行此检查(确认请求尚未以
    /api
    开始)

    默认情况下,通过重定向保留任何查询字符串

    请注意,这目前是一个临时重定向。如果这是永久重定向,则只有在确认其正常工作后才更改为308,以避免潜在的缓存问题

    如上所述,您需要在测试之前清除浏览器缓存

    你没有明确说明这是什么或如何不起作用的。但是,这里有几个问题

  • 301(永久)重定向不会保留初始请求中的请求方法。浏览器将对重定向请求发出GET请求,因此在POST请求的情况下,任何POST数据都将丢失。您需要使用307(临时)或308(永久)响应代码来保留请求方法

    但请注意,301(和308)响应由浏览器永久缓存。因此,在测试之前,您需要清除浏览器缓存(以及任何中间缓存)

  • 由于这些指令直接位于
    容器中(与
    块或
    .htaccess
    相反),这将导致URL路径开始处出现双斜杠,因为URL路径与
    重写规则
    模式匹配(您将完整捕获该模式)包括完整的根相对URL路径,以斜杠开头

  • 请求/发布/标题/其他参数需要保留

    不确定您在这里的确切意思,但不一定能够通过重定向保留所有“标题”,因为这毕竟完全由浏览器决定

    您只能告诉浏览器要重定向到的新URL(作为HTTP响应头的一部分)和HTTP状态代码,以指示浏览器应如何处理响应

    请尝试以下操作:

    RewriteRule !^/api https://web.example.com%{REQUEST_URI} [R=307,L]
    
    不需要额外的
    RewriteCond
    指令,因为在
    RewriteRule
    指令本身中可以更容易(更有效)执行此检查(确认请求尚未以
    /api
    开始)

    默认情况下,通过重定向保留任何查询字符串

    请注意,这目前是一个临时重定向。如果这是永久重定向,则只有在确认其正常工作后才更改为308,以避免潜在的缓存问题

    如上所述,您需要在测试之前清除浏览器缓存