添加.php扩展名的Rewrite规则与HTTPS跳转冲突失效求助
问题原因及解决方案
核心原因
你的规则顺序错误,同时缺少目录排除条件,导致重写逻辑不符合预期:
- 规则顺序颠倒:你将内部重写添加.php的规则放在了HTTPS强制跳转之前。当用户通过HTTP访问不带后缀的URL时,会先被内部重写成带.php的地址,再触发HTTPS跳转,最终浏览器地址栏显示的是带.php的HTTPS链接,看起来规则完全没生效。
- 未排除真实目录:现有规则只排除了存在的文件,但没排除存在的目录。如果访问的是真实目录(比如
/blog/),规则会尝试将其重写成/blog/.php,引发错误的同时干扰正常访问。
修正后的.htaccess配置
RewriteEngine On # 优先强制HTTPS跳转,确保所有请求先转到HTTPS环境 RewriteCond %{SERVER_PORT} !=443 RewriteRule ^(.*)$ https://mysite/$1 [R=301,L,QSA] # 内部重写:不带.php的URL映射到对应的.php文件(排除真实文件和目录) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php [NC,L] # 可选:将带.php的URL自动跳转到不带后缀的版本(避免重复收录) RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\.]+)\.php\ HTTP/ RewriteRule ^([^\.]+)\.php$ /$1 [R=301,L,QSA]
关键修正点说明
- 调整顺序:先完成HTTPS跳转,再处理内部重写,这样跳转后的URL保持不带.php的形式,符合你的需求。
- 添加目录排除:新增
RewriteCond %{REQUEST_FILENAME} !-d,避免对真实目录执行错误重写。 - 可选反向跳转:补充的规则会将带.php的URL自动跳转到无后缀版本,既优化URL美观度,也避免搜索引擎收录重复内容。
内容的提问来源于stack exchange,提问作者Rick Crofts
相关产品推荐
相关产品推荐

