Apache htaccess:将目录式URL重写为查询参数的配置问题
问题描述
我的应用可通过URL:https://example.com/dev/myapp/#/?query=1234 访问,希望无需创建子目录/1234,允许通过https://example.com/dev/myapp/1234 替代访问,并通过.htaccess将后者重写/转发至前者。
我尝试了以下规则:
RewriteEngine On RewriteRule ^myapp/([^/])?$ myapp/index.html?query=$1 [L]
该规则会将https://example.com/dev/myapp/1234 转发至https://example.com/dev/myapp/1234#/;
另一个规则:
RewriteEngine On RewriteRule ^(?!myapp/)([^/])?$ /dev/myapp?query=$1 [L,R=302]
会将https://example.com/dev/myapp/1234 转发至https://example.com/dev/myapp/?query=1234#/。
我无法写出正确的语法,恳请帮助。
解决方案
首先明确:URL中的哈希(#)部分是浏览器端处理的内容,服务器无法直接修改或控制,所以我们需要通过重定向让浏览器加载带正确哈希结构的目标URL。
正确的.htaccess规则(放置在/dev/myapp/目录下)
RewriteEngine On # 排除实际存在的文件和目录,避免干扰静态资源加载 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配路径段并重定向到带哈希的目标URL RewriteRule ^([^/]+)$ /dev/myapp/#/?query=$1 [L,R=302]
规则细节说明
RewriteCond条件:确保只对不存在的文件/目录生效,防止重写css、js、图片等实际存在的资源。RewriteRule匹配逻辑:^([^/]+)$:精准匹配/dev/myapp/之后的任意非空路径片段(比如1234)。/dev/myapp/#/?query=$1:直接指定包含哈希的目标URL,浏览器会自动识别哈希部分并处理。[L,R=302]:L表示终止后续规则执行,R=302代表临时重定向,若需永久重定向可改为R=301。
根目录.htaccess适配方案
如果你的.htaccess放在网站根目录(/)下,规则需调整为:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^dev/myapp/([^/]+)$ /dev/myapp/#/?query=$1 [L,R=302]
内容的提问来源于stack exchange,提问作者ulrich
相关产品推荐
相关产品推荐

