修复Apache服务器重写后路径式URL被301重定向问题
问题描述
我使用单页应用(SPA)动态生成页面,原URL格式为https://oga.org.uk/boat_register/boat/?oga_no=3511。我在/boat_register目录下部署了如下.htaccess文件:
Options -Multiviews RewriteEngine on RewriteBase /boat_register/ RewriteRule ^boat/([0-9]+)/?$ /boat_register/boat?oga_no=$1 [QSA,L]
这条规则本应让路径式URL(如https://oga.org.uk/boat_register/boat/3511)和参数式URL都能访问页面,但目前访问路径式URL时,会被301重定向到参数式URL,我希望路径式URL能保留在地址栏中。以下是路径式请求的服务器响应:
> GET /boat_register/boat/3511 HTTP/2 > Host: oga.org.uk > User-Agent: curl/8.1.2 > Accept: */* > < HTTP/2 301 < content-type: text/html; charset=iso-8859-1 < server: Apache < location: http://oga.org.uk/boat_register/boat/?oga_no=3511 < x-origin-cache-status: HIT < date: Sat, 16 Sep 2023 06:21:46 GMT < x-via: LHR2 < x-cdn-node-is-at-origin: 1 < x-cdn-cache-status: HIT < <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://oga.org.uk/boat_register/boat/?oga_no=3511">here</a>.</p> </body></html>
解决方案
问题出在RewriteRule的目标路径写法上:你使用了绝对路径(/boat_register/boat?oga_no=$1),Apache会将其识别为外部重定向,从而返回301并修改地址栏。只需将目标改为相对路径,结合已设置的RewriteBase,就能实现内部重写,地址栏保持不变。
修改后的.htaccess内容如下:
Options -Multiviews RewriteEngine on RewriteBase /boat_register/ RewriteRule ^boat/([0-9]+)/?$ boat?oga_no=$1 [QSA,L]
原理说明
- 当RewriteRule的目标以
/开头时,Apache会将其视为根路径下的绝对地址,触发外部重定向(301)。 - 改用相对路径后,Apache会基于
RewriteBase /boat_register/将目标解析为/boat_register/boat?oga_no=$1,但这是内部重写,不会向浏览器发送重定向响应,因此地址栏会保留原始的路径式URL。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

