【问题标题】: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:
- 如果路径具有此模式:
https://example.com/api,则继续请求。无需重定向。
- 对于所有其他路径,重定向到
https://web.example.com,
- 在这两种情况下,都需要保留请求/发布/标头/其他参数。
我目前有这个,但它不工作
<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]
您没有具体说明这不起作用或如何起作用。但是,这里有几个问题。
-
301(永久)重定向不会保留初始请求中的请求方法。浏览器将对重定向的请求发出 GET 请求,因此任何 POST 数据在 POST 请求的情况下都会丢失。您需要改用 307(临时)或 308(永久)响应代码来保留请求方法。
但请注意,301(和 308)响应由浏览器永久缓存。因此,您需要在测试前清除浏览器缓存(以及任何中间缓存)。
-
由于这些指令直接位于 <VirtualHost> 容器中(与 <Directory> 块或 .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,以避免潜在的缓存问题。
如上所述,您需要在测试前清除浏览器缓存。