|
- https://www.doubao.com/thread/wde4055848889c796
- ##################################################################################################################
- apache的rewrite规则 配置号以后是由客户端访问新的网址吗?
- ######################################
- 在配置Apache的Rewrite规则后,客户端是否访问新网址,取决于你设置的是哪种重写类型。主要有以下两种情况:
- 1. **内部重写(Internal Rewrite)**:客户端不会访问新网址。服务器在内部将请求的URL转换为另一个URL,而客户端并不知道这个转换过程。客户端的浏览器地址栏中显示的仍然是原始的URL。这种情况通常使用`[L]`标记(最后一个规则),但不使用`[R]`(重定向)标记。
- 2. **外部重定向(External Redirect)**:客户端会访问新网址。服务器返回一个HTTP状态码(如301或302),告诉客户端请求的资源已移动到新的URL。客户端浏览器会自动访问这个新URL,并且地址栏会更新为新的URL。这种情况需要在RewriteRule中添加`[R]`标记,例如`[R=301]`或`[R=302]`。
- ### 示例
- 以下是两种情况的示例配置:
- **内部重写示例**:
- ```apache
- RewriteEngine On
- RewriteRule ^old-page$ new-page [L]
- ```
- 在这个例子中,当用户访问`http://example.com/old-page`时,服务器会在内部将请求转换为`new-page`,但浏览器地址栏仍显示`http://example.com/old-page`。
- **外部重定向示例**:
- ```apache
- RewriteEngine On
- RewriteRule ^old-page$ new-page [R=301,L]
- ```
- 在这个例子中,当用户访问`http://example.com/old-page`时,服务器会返回一个301状态码,告诉浏览器重定向到`http://example.com/new-page`。浏览器会自动访问新URL,并且地址栏会更新为新的URL。
- ### 总结
- - 如果你希望客户端访问新网址,需要使用带有`[R]`标记的重定向规则。
- - 如果你希望客户端不知道URL的变化,只需要服务器内部处理请求,不使用`[R]`标记。
- ##################################################################################################################
- RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] 这个是外部还是内部重定向
- ######################################
- 这个 RewriteRule 是**外部重定向**。分析如下:
- ### 关键标志解析
- ```apache
- RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
- ```
- 1. **`R=permanent`**(等同于 `R=301`):明确指示 Apache 返回 **HTTP 301 永久重定向**,强制客户端(浏览器)重新请求新 URL。
- 2. **`NE`**(No Escape):仅影响替换字符串的编码,不改变重定向类型。
- 3. **`END`**(或 `L`):终止当前重写循环,但不影响重定向行为。
- ### 重定向逻辑
- - **匹配规则**:`^` 匹配所有请求路径(空字符串开头)。
- - **替换目标**:将请求重写到 `https://当前域名/原请求路径`。
- - **效果**:客户端请求会被强制跳转到 HTTPS 版本,且浏览器地址栏会更新为新 URL。
- ### 典型应用场景
- 常用于**强制 HTTPS 访问**,例如:
- - 访问 `http://example.com/page` → 浏览器自动跳转至 `https://example.com/page`
- - 用户会看到地址栏更新,且浏览器会重新发送请求到新 URL。
- ### 与内部重写对比
- 若需内部重写(服务器端透明处理),应**移除 `R` 标志**,例如:
- ```apache
- # 内部重写示例(无 R 标志)
- RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE]
- ```
- 但这种配置会导致问题:客户端仍使用 HTTP 发送请求,而服务器返回 HTTPS URL,可能引发循环重定向或连接错误。因此,强制 HTTPS 必须使用外部重定向(带 `R` 标志)。
- ### 结论
- 该规则通过 **301 永久重定向**将 HTTP 请求转换为 HTTPS 请求,属于**外部重定向**。
- ##################################################################################################################
复制代码
|
|