非根目录URL重写规则失效及URL美化需求咨询
解决方案
嘿,这需求完全可行!不过你原来的规则顺序和逻辑有点问题——外部重定向(比如HTTPS跳转、URL美化的跳转)得放在内部重写前面,不然会出现规则冲突或者达不到预期效果。我给你整理了一套完整的规则,逐段给你解释清楚:
RewriteEngine On # 1. 强制跳转到HTTPS+无www的域名 RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC] RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE] # 2. 特定目录URL美化:把/directory/?id=Test 301跳转到/directory/Test/ RewriteCond %{QUERY_STRING} ^id=([^&]+)$ [NC] RewriteRule ^directory/?$ /directory/%1/ [R=301,L,NE] # 3. 反向内部重写:让服务器能识别/directory/Test/ 对应原参数格式 RewriteRule ^directory/([^/]+)/?$ /directory/?id=$1 [L,QSA] # 4. 全局移除index.php:把带index.php的URL永久跳转到干净路径 RewriteCond %{THE_REQUEST} /index\.php [NC] RewriteRule ^index\.php/(.*)$ /$1/ [R=301,L,NE] RewriteRule ^index\.php$ / [R=301,L,NE] # 5. 全局内部重写:把非静态资源的请求指向index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?id=$1/ [L]
规则细节说明:
- 第1段:修正了你原来的HTTPS/WWW跳转逻辑,把条件和规则对应起来,确保所有访问都会跳转到
https://example.com,NE标记避免特殊字符被转义。 - 第2段:专门匹配
directory目录下带id参数的请求,把它转换成美观的路径形式,%1是捕获的id参数值。 - 第3段:当用户访问美化后的路径时,服务器内部偷偷转成PHP能识别的
?id=xxx格式,不影响用户看到的URL。 - 第4段:通过匹配用户实际发送的请求行(
THE_REQUEST)避免循环,把所有带index.php的URL都跳转到干净的路径。 - 第5段:保留了你原来的内部重写逻辑,但增加了
!-f和!-d条件,确保图片、CSS这类静态资源不会被错误重写。
测试小提示:
一开始可以把R=301改成R=302(临时重定向),确认所有规则都符合预期后再改回301(永久重定向,浏览器会缓存),避免缓存错误规则导致麻烦。
内容的提问来源于stack exchange,提问作者wllkle
相关产品推荐
相关产品推荐

