我正在尝试在 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>
最佳答案
RewriteCond %{REQUEST_URI} !^/api$ RewriteRule ^(.*)$ https://web.example.com/$1 [R=301,L]
您没有具体说明这不起作用或如何起作用。但是,这里有几个问题。
但请注意,浏览器会永久缓存 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/