我有两个不同的例子,其中 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
答案1
您的问题是您没有为 curl 使用适当的主机名。重写规则是在匹配主机名的条件下触发的示例.com。如果您只是使用,curl http://localhost
那么 httpd 将获取主机名“localhost”,并且规则不匹配。而是使用 curl 命令,其中的 --proxy 参数指向 localhost(请务必指定端口号!)和与预期主机名匹配的 url 参数。如下所示:
curl --proxy localhost:80 http://example.com