PHP项目如何用.htaccess的mod_rewrite实现简洁URL(移除.php及冗余路径)
实现PHP项目的美观URL(移除.php扩展名+简化路径)
嘿,我正好处理过类似的需求,用Apache的mod_rewrite完全可以实现你要的效果,下面是一步步的配置方案:
前提准备
- 先确认你的Apache服务器已经开启了
mod_rewrite模块(大多数环境默认开启,如果没开,需要在Apache配置里启用它) - 在你的项目根目录(也就是
localhost/myproject/对应的文件夹)新建或编辑.htaccess文件
.htaccess 具体配置
把下面的代码复制到.htaccess文件里,根据你的实际情况微调:
Options -Indexes +FollowSymLinks RewriteEngine On # 核心规则:将简洁URL内部映射到实际的PHP文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/myproject/views/pages/%{REQUEST_URI}/%{REQUEST_URI}.php -f RewriteRule ^([^/]+)$ views/pages/$1/$1.php [L] # 重定向直接访问的原始PHP路径到美观URL(避免重复内容) RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/myproject/views/pages/([^/]+)/\1\.php [NC] RewriteRule ^ /myproject/%1 [R=301,L]
规则解释
Options -Indexes +FollowSymLinks:禁用目录索引(防止别人看到你的文件列表),允许服务器跟随符号链接,确保重写规则正常工作RewriteEngine On:开启URL重写功能,这是所有规则的基础- 第一组规则:
RewriteCond %{REQUEST_FILENAME} !-d:检查用户请求的不是一个实际存在的目录RewriteCond %{DOCUMENT_ROOT}/myproject/views/pages/%{REQUEST_URI}/%{REQUEST_URI}.php -f:检查对应的实际PHP文件(比如views/pages/login/login.php)是否存在RewriteRule ^([^/]+)$ views/pages/$1/$1.php [L]:把用户输入的localhost/myproject/login内部映射到views/pages/login/login.php,[L]表示这是最后一条规则,匹配后不再往下执行
- 第二组规则:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/myproject/views/pages/([^/]+)/\1\.php [NC]:捕获用户直接访问原始PHP文件的请求RewriteRule ^ /myproject/%1 [R=301,L]:将这类请求301永久重定向到美观的URL,比如把localhost/myproject/views/pages/login/login.php跳转到localhost/myproject/login
注意事项
- 把配置里的
myproject替换成你实际的项目目录名,如果你的项目直接在Apache根目录(比如localhost/login),就把所有/myproject/改成/ - 确保你的页面结构严格遵循
views/pages/页面名/页面名.php的格式,比如登录页就是login/login.php,注册页就是register/register.php,这样规则才能正确匹配 - 如果有特殊页面不符合这个结构,可以单独添加针对性的Rewrite规则
- 测试前记得清空浏览器缓存,因为301重定向会被浏览器缓存,可能导致测试结果不准确
内容的提问来源于stack exchange,提问作者FranSto
相关产品推荐
相关产品推荐

