使用.htaccess隐藏URL中项目名称后内容的配置及部署适配问题
使用.htaccess隐藏URL中项目名称后内容的配置及部署适配问题
看起来你是想把本地环境里带项目名称的URL(比如http://localhost/myproject-name/admin/home/)简化成不带项目名的形式(比如http://localhost/admin/home/),同时还要考虑部署到线上主机后的适配,我来一步步帮你调整配置:
一、本地环境(localhost)的配置调整
首先要注意:把你的.htaccess文件放在网站根目录(比如XAMPP的htdocs目录,而不是myproject-name子目录里),然后替换成下面的规则:
DirectorySlash Off RewriteEngine On # 第一步:把带项目名的URL重定向到不带的版本(避免重复内容) RewriteCond %{THE_REQUEST} /myproject-name/([^\s?]+) [NC] RewriteRule ^ /%1 [L,R=301,NE] # 第二步:内部转发不带前缀的请求到实际项目子目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /myproject-name/$1 [L]
这样设置后:
- 当你访问
http://localhost/myproject-name/admin/home/时,会自动跳转到http://localhost/admin/home/ - 服务器内部会实际去
myproject-name子目录下找对应的内容,完全不影响功能
二、部署到线上主机后的适配
线上主机的配置要根据你的项目部署位置来调整:
情况1:项目部署在主机根目录(比如public_html)
如果你的项目直接放在主机的网站根目录,那不需要再处理子目录的转发了,修改.htaccess为:
DirectorySlash Off RewriteEngine On # 跳过真实存在的文件和目录,转发到项目入口文件(比如index.php,根据你的框架/项目调整) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
情况2:项目仍然部署在主机的子目录下
如果线上主机里你的项目还是放在子目录(比如public_html/myproject-name),那和本地环境的配置逻辑一样,只需要把规则里的/myproject-name/换成线上的子目录名称,同时把.htaccess放在主机的根目录(public_html)即可。
几个重要的注意事项
- 确保你的本地服务器(XAMPP/WAMP)和线上主机都开启了
mod_rewrite模块,否则规则不会生效 - 测试阶段可以把
R=301改成R=302(临时重定向),确认配置没问题后再换成301(永久重定向),避免浏览器缓存错误的重定向规则 - 如果你的项目是基于特定框架(比如Laravel、CodeIgniter),最后一条转发规则要对应框架的入口文件,比如Laravel是转发到
index.php
备注:内容来源于stack exchange,提问作者salim galad




