【问题标题】:How to configure Apache2 on ubuntu DigitalOcean to correctly redirect all except one path如何在 ubuntu DigitalOcean 上配置 Apache2 以正确重定向除一条路径之外的所有路径
【发布时间】:2021-01-12 19:57:56
【问题描述】:

我正在尝试在 DigitalOcean droplet 上运行的 Ubunti OS 上设置 Apache2:

  1. 如果路径具有此模式:https://example.com/api,则继续请求。无需重定向。
  2. 对于所有其他路径,重定向到https://web.example.com
  3. 在这两种情况下,都需要保留请求/发布/标头/其他参数。

我目前有这个,但它不工作

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

【问题讨论】:

    标签: ubuntu redirect mod-rewrite apache2


    【解决方案1】:
    RewriteCond %{REQUEST_URI} !^/api$
    RewriteRule ^(.*)$  https://web.example.com/$1  [R=301,L]
    

    您没有具体说明这不起作用或如何起作用。但是,这里有几个问题。

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

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

    2. 由于这些指令直接位于 &lt;VirtualHost&gt; 容器中(与 &lt;Directory&gt; 块或 .htaccess 相对),这将导致 URL 路径的开头出现双斜杠,因为 URL 路径匹配RewriteRule pattern(您正在完整捕获)包括完整的根相对 URL 路径,以斜杠开头。

    request/post/headers/其他参数需要保留。

    不确定您在这里的确切含义,但不一定可以通过重定向保留所有“标头”,因为这毕竟完全由浏览器决定。

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

    请尝试以下方法:

    RewriteRule !^/api https://web.example.com%{REQUEST_URI} [R=307,L]
    

    不需要额外的RewriteCond 指令,因为可以在@987654330 中更轻松(有效)地执行此检查(即请求尚未开始 /api @ 指令本身。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2015-04-19
      • 2019-10-28
      • 2021-03-24
      • 2010-09-06
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多