如何通过.htaccess将URL重写指向目录中最后一个子文件夹?
用.htaccess实现访问根目录自动指向最新版本子文件夹
当然可以实现这个需求!根据你的服务器权限情况,我准备了两种方案,你可以按需选择:
方案一:自动识别最新版本(需要服务器配置权限)
如果你能修改Apache的配置文件(比如httpd.conf或者虚拟主机配置),这个方案可以自动抓取目录里版本号最高的子文件夹,不用每次更新版本都手动改规则。
步骤1:写个版本检测脚本
在服务器上新建一个Shell脚本(比如叫get-latest-version.sh),建议放在网站根目录以外的安全位置,内容如下:
#!/bin/bash # 切换到目标目录 cd /path/to/site # 列出所有x.y.z格式的子目录,按版本号排序后取最后一个(也就是最新的) ls -d [0-9]*.[0-9]*.[0-9]* | sort -V | tail -n1
然后给这个脚本加执行权限:
chmod +x /path/to/get-latest-version.sh
步骤2:配置Apache的RewriteMap
打开你的Apache配置文件,添加下面这行:
RewriteMap latestVersion prg:/path/to/get-latest-version.sh
记得把/path/to/get-latest-version.sh换成你实际的脚本路径哦。
步骤3:编写.htaccess规则
在/path/to/site目录下的.htaccess文件里加这些规则:
RewriteEngine On # 只有当请求的是site目录本身(不带任何子路径)时才触发 RewriteCond %{REQUEST_URI} ^/path/to/site/?$ # 排除已存在的文件或目录,避免出现循环重写的问题 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # *内部重写*到最新版本目录——浏览器地址栏不会变,用户看到的还是原来的URL,但内容是最新版本的 RewriteRule ^$ ${latestVersion}/ [L] # 如果你想让浏览器地址栏直接跳转到最新版本的URL(比如让用户看到http://host/path/to/site/0.3.0),就把上面的RewriteRule换成下面的: # RewriteRule ^$ ${latestVersion}/ [R=302,L] # 提示:R=302是*临时重定向*,要是确定版本不会频繁变动,可以改成R=301(*永久重定向*)
方案二:手动指定最新版本(无需服务器配置权限)
要是你用的是共享主机,没法修改Apache的配置文件,那就用这个简单直接的方案——直接把最新版本写在规则里,每次更新版本时手动改一下.htaccess就行。
在/path/to/site的.htaccess里加这些内容:
RewriteEngine On # 仅针对site目录本身的请求生效 RewriteCond %{REQUEST_URI} ^/path/to/site/?$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # *内部重写*到0.3.0目录,地址栏不变 RewriteRule ^$ 0.3.0/ [L] # 想要*外部重定向*的话,换成下面这行: # RewriteRule ^$ 0.3.0/ [R=302,L]
以后新增版本比如0.4.0时,只要把规则里的0.3.0改成0.4.0就搞定了。
一些注意事项
- 得确保你的Apache服务器已经开启了
mod_rewrite模块,而且网站目录的AllowOverride配置设成了All,不然.htaccess的规则不会生效哦。 - 如果用了永久重定向(R=301),浏览器会缓存这个规则,后续改版本号后可能需要清一下浏览器缓存才能看到效果。
内容的提问来源于stack exchange,提问作者bjorkblom
相关产品推荐
相关产品推荐

