.htaccess配置:将Kohana子目录非www域名重定向到www并去除index.php
解决Kohana子目录非www重定向到www且不自动追加index.php的问题
我很清楚你遇到的这个麻烦——原本想把/quotes子目录下的非www请求转去www版本,结果重定向后末尾自动加了index.php,破坏了Kohana的URL美化效果。问题核心其实是规则执行顺序不对:如果先跑Kohana的内部重写再做www跳转,就会带上index.php。咱们把顺序反过来,先完成www重定向,再处理Kohana的URL重写,就能解决问题。
直接上完整的/quotes目录下的.htaccess配置(注意是子目录里的这个文件,不是根目录WordPress的.htaccess):
1. 先做非www到www的强制重定向
RewriteEngine On # 匹配非www开头的域名 RewriteCond %{HTTP_HOST} !^www\. [NC] # 只对/quotes子目录的请求生效,不影响根目录的WordPress RewriteCond %{REQUEST_URI} ^/quotes/ [NC] # 301永久重定向到www版本,保留原请求路径,不会加index.php RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/quotes/$1 [R=301,L]
这里的关键是[L]标记,它会让这条重定向规则执行后就停止,不会触发后面的Kohana重写,避免带上index.php。
2. 再添加Kohana的URL美化规则
在上面的重定向规则之后,放Kohana默认的移除index.php的规则:
# Kohana内部重写,移除URL里的index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
这部分规则的作用是:如果请求的不是真实存在的文件或目录,就把请求转发给index.php处理,同时保持URL里没有index.php。
几个重要的注意点
- 一定要确保
/quotes目录的.htaccess优先级更高,Apache默认会优先读取子目录的配置,所以不用太担心和根目录WordPress的规则冲突。 - 测试的时候可以先把
R=301改成R=302(临时重定向),确认跳转正常后再改回301,避免浏览器缓存错误的规则。 - 顺便检查下Kohana的
application/config/config.php里的base_url,最好设置成https://www.mydomain.com/quotes/,这样框架生成的URL本身就是www版本,减少不必要的跳转。
这样配置之后,你访问mydomain.com/quotes/my-favorite-quote会直接跳转到www.mydomain.com/quotes/my-favorite-quote,完全不会出现多余的index.php,Kohana的URL美化也能正常工作。
内容的提问来源于stack exchange,提问作者VenomRush
相关产品推荐
相关产品推荐

