3

在Apache 2.2的mod_rewrite 文档[R]中,RewriteRule标志指出:

可以使用语法 [R=305] 指定任何有效的 HTTP 响应状态代码,如果未指定,则默认使用 302 状态代码。指定的状态代码不一定是重定向 (3xx) 状态代码。但是,如果状态代码超出重定向范围 (300-399),则替换字符串将被完全删除,并停止重写,就像使用了 L 一样。

除了响应状态代码之外,您还可以使用其符号名称指定重定向状态:(temp默认)permanent、 或seeother

然而,以下代码片段似乎只允许“符号名称”:

# Force HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off

# this works
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent,NE]

# this doesn't work
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=308,NE]

错误日志显示:

[2017 年 5 月 23 日星期二 23:11:12] [警报] [客户端 192.168.33.1] /var/www/html/ventus/.htaccess: RewriteRule: 标志“R”的 HTTP 响应代码“308”无效

但是,308 似乎是永久重定向的 HTTP 状态代码:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308

这是 Apache 中的错误还是我做错了什么?

4

2 回答 2

1

您的 apache (2.2) 版本不能使用 308。在 apache 2.4.3 中添加了对 308 状态的支持:https ://archive.apache.org/dist/httpd/CHANGES_2.4.3

核心:添加向 IANA 注册的缺失 HTTP 状态代码。

于 2017-05-24T03:07:51.053 回答
0

是的,这是一个错误。您对文档的解释是正确的,应该接受 300-399 范围内的所有代码。

于 2020-01-17T19:03:55.357 回答