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

标签 ubuntu redirect mod-rewrite apache2

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

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

  • 我目前有这个,但它不工作
    <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>
    

    最佳答案

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

    您没有具体说明这不起作用或如何起作用。但是,这里有几个问题。
  • 301(永久)重定向不会保留初始请求中的请求方法。浏览器将对重定向的请求发出 GET 请求,因此任何 POST 数据在 POST 请求的情况下都会丢失。您需要使用 307(临时)或 308(永久)响应代码来保留请求方法。
    但请注意,浏览器会永久缓存 301(和 308)响应。因此,您需要在测试之前清除浏览器缓存(以及任何中间缓存)。
  • 由于这些指令直接在 <VirtualHost>容器(与 <Directory> block 或 .htaccess 相对)这将导致 URL 路径的开头出现双斜杠,因为 URL 路径与 RewriteRule 匹配。模式(您正在完整捕获)包括完整的根相对 URL 路径,以斜杠开头。

  • request/post/headers/other parameters need to be preserved.


    不确定您在这里的确切含义,但不一定可以通过重定向保留所有“ header ”,因为这毕竟完全由浏览器决定。
    您可以告诉浏览器的是要重定向到的新 URL(作为 Location HTTP 响应 header 的一部分)和 HTTP 状态代码,以指示浏览器应如何处理响应。
    请尝试以下操作:
    RewriteRule !^/api https://web.example.com%{REQUEST_URI} [R=307,L]
    
    不需要额外的 RewriteCond指令,因为这种检查(请求尚未以 /api 开始)可以在 RewriteRule 指令本身中更容易(和有效地)执行。
    默认情况下,通过重定向保留任何查询字符串。
    请注意,这目前是一个临时重定向。如果这是永久性的,那么只有在确认它可以正常工作后才更改为 308,以避免潜在的缓存问题。
    如上所述,您需要在测试前清除浏览器缓存。

    关于ubuntu - 如何在 ubuntu DigitalOcean 上配置 Apache2 以正确重定向除一条路径之外的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64081778/

    相关文章:

    apache - 301 将 index.html 重定向到/或/index.php

    linux - 在终端中运行 "source ~/.profile"之前,RVM 无法识别

    .htaccess 重写规则在传递多个变量时导致错误 404

    .htaccess - mod_rewrite : If the file exists in another directory, 改为服务那个

    php - 如何在 WordPress 中以编程方式重定向 URL?

    javascript - 用php编写客户端重定向服务器端

    php - htaccess 301 重定向 - 删除查询字符串

    Google Compute Engine VM 上的 Ubuntu do-release-upgrade

    ubuntu - Mellanox 网卡在 lspci 和 lshw 中列出,但不在 ip 链接中

    bash 选项卡自动完成速度太慢,但不是 teraterm 或 putty