非www域名访问URL带index.php的.htaccess配置问题求助
解决URL重定向后带/index.php的问题
嘿,我太懂你折腾各种配置都没解决的闹心劲儿了——这种看似简单的问题卡壳确实让人头大!咱们来一步步揪出问题根源,然后彻底搞定它。
问题出在哪:规则顺序搞反了
你的.htaccess里规则的执行顺序是核心问题:你先把所有非文件/目录的请求重写到/index.php,然后才做域名跳转(example.fr→www.example.fr)和HTTPS强制跳转。这就导致当你访问example.fr时,服务器先把空请求转成了/index.php,再带着这个路径去做后续的重定向,最终就变成了https://www.example.fr/index.php。
修正后的.htaccess配置
把规则顺序调过来,先搞定协议(HTTPS)和域名(统一到www),最后再处理前端路由的index.php重写。试试下面的配置:
<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteBase /web/ # 1. 强制所有请求使用HTTPS,优先保证协议正确 RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 2. 把非www的example.fr跳转到HTTPS的www版本,统一域名 RewriteCond %{HTTP_HOST} ^example\.fr$ [NC] RewriteRule ^(.*)$ https://www.example.fr/$1 [L,R=301] # 3. 最后处理前端控制器:仅当请求不是文件/目录时,内部重写到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,QSA] </IfModule>
关键修改说明
- 规则顺序优先级:先处理协议和域名的重定向,确保这些跳转完成后,再处理内部的路由重写,这样就不会把
index.php带入到最终的URL里。 - HTTPS跳转前置:放在最前面,确保所有请求先强制转到HTTPS,避免后续跳转出现协议混乱。
- 域名跳转一步到位:直接匹配
example.fr跳转到HTTPS的www版本,不需要分两次跳转。 - 路由重写路径修正:把原来的
/index.php改成index.php,因为你设置了RewriteBase /web/,这样路径会更准确,避免跳出指定目录。
额外提醒
别忘了清除浏览器缓存!因为301是永久重定向,浏览器会缓存旧的跳转规则,修改后可能需要强制刷新(Ctrl+F5)才能看到效果。
内容的提问来源于stack exchange,提问作者DevMoutarde
相关产品推荐
相关产品推荐

