如何在Apache的.htaccess中实现带指定后缀的子域名URL重写
解决api子域名的RESTful API重写需求
咱们先理清楚你的核心诉求:在api.mysite.com子域名下,把以app/、images/、lib/开头的请求,分别转发到服务器根目录的/assets/api/app/index.php、/assets/api/images/index.php、/assets/api/libs/index.php,并且只传递前缀后的纯路径部分(比如/carts、/banner/21)给对应的处理文件。
下面是调整后的服务器根目录.htaccess完整配置,完全匹配你的需求:
RewriteEngine On RewriteBase / # 优先放行已存在的静态资源(文件、目录、符号链接),避免重写拦截 RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] # 仅对api子域名的请求应用后续重写规则 RewriteCond %{HTTP_HOST} ^api\. [NC] # 处理app前缀请求:api.mysite.com/app/carts → /assets/api/app/index.php?path=/carts RewriteRule ^app/(.*)$ /assets/api/app/index.php?path=/$1 [L,NC,QSA] # 处理images前缀请求:api.mysite.com/images/banner/21 → /assets/api/images/index.php?path=/banner/21 RewriteRule ^images/(.*)$ /assets/api/images/index.php?path=/$1 [L,NC,QSA] # 处理lib前缀请求:api.mysite.com/lib/lib.js → /assets/api/libs/index.php?path=/lib.js RewriteRule ^lib/(.*)$ /assets/api/libs/index.php?path=/$1 [L,NC,QSA]
配置细节解释
- 静态资源放行规则:开头的三个
RewriteCond会跳过对已存在的文件、目录、符号链接的重写,保证图片、JS、CSS等静态资源可以直接访问,不会被API规则拦截。 - 子域名匹配条件:
RewriteCond %{HTTP_HOST} ^api\. [NC]确保下面的重写规则只作用于api.mysite.com,不会影响主域名或其他子域名。 - 前缀匹配与路径传递:
- 每个
RewriteRule用(.*)捕获前缀后的所有路径内容(比如app/carts里的carts) - 通过
?path=/$1将纯路径(比如/carts)作为查询参数传递给对应的index.php - 标志
L表示匹配后停止后续规则,NC忽略大小写,QSA保留原始请求的查询参数(比如api.mysite.com/app/carts?foo=bar会被重写为/assets/api/app/index.php?path=/carts&foo=bar)
- 每个
API获取路径的方式
在对应的index.php文件中,你可以直接通过$_GET['path']拿到传递的纯路径,比如:
// /assets/api/app/index.php $requestPath = $_GET['path']; // 当请求api.mysite.com/app/carts时,$requestPath的值是"/carts"
这样就完全实现了你想要的:让API只接收前缀后的路径部分,同时保持子域名的友好URL格式。
内容的提问来源于stack exchange,提问作者vinoli
相关产品推荐
相关产品推荐

