У меня есть два разных примера, где Apache Httpd 2.4 на Centos7 настроен для выполнения перенаправления с флагом 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 с аргументом --proxy, указывающим на localhost (обязательно укажите номер порта!), И аргументом url, соответствующим ожидаемому имени хоста. Примерно так:
curl --proxy localhost:80 http://example.com