我有两个不同的例子,说明 Centos7 上的 Apache Httpd 2.4 配置为使用 R=301 标志执行重定向,但它们实际上返回 302 重定向。一种是极其简单的情况,只是将http重定向到https。以下是重写规则的范围:
<VirtualHost ...>
... other content ...
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [NC,R=301,L]
</VirtualHost>
为什么这会返回 302 重定向而不是 301?
# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 example.com (/etc/httpd/sites-
enabled/example.com.conf:5)
*:443 example.com (/etc/httpd/sites-
enabled/example.com.conf:23)
Syntax OK
您的问题是您没有为 curl 使用适当的主机名。在匹配主机名example.com的条件下触发重写规则。如果您只是在使用,
curl http://localhost
那么 httpd 会获取主机名“localhost”并且规则不匹配。而是使用 curl 命令和指向 localhost 的 --proxy 参数(确保指定端口号!)和与预期主机名匹配的 url 参数。像这样: