.htaccess实现无跳转URL重写问题求助
解决方案
先修正现有.htaccess的两处错误
你当前的www和HTTPS跳转规则存在捕获组缺失的问题,会导致路径丢失跳转到首页,先修正这两个规则:
RewriteEngine On # 非www跳转至www RewriteCond %{HTTP_HOST} !^www.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # HTTP跳转至HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
实现URL改写(无跳转)或301跳转
根据你的需求,分两种场景配置:
场景1:仅内部URL改写(浏览器地址栏显示/thankyou,实际加载/thankyou.html)
添加以下规则到HTTPS跳转规则之后:
# 内部重写/thankyou到实际文件thankyou.html RewriteRule ^thankyou$ /thankyou.html [L]
场景2:同时处理旧URL跳转(访问/thankyou.html时301跳转到/thankyou,再内部加载)
如果想让旧的/thankyou.htmlURL自动跳转到新的/thankyou(避免重复内容,利于SEO),添加这两个规则:
# 301跳转旧URL到新URL RewriteRule ^thankyou.html$ /thankyou [L,R=301] # 内部重写新URL到实际文件 RewriteRule ^thankyou$ /thankyou.html [L]
为什么你之前的规则会跳首页?
你写的RewriteRule ^thankyou.html /thankyou/$1 [L]有两个问题:
- 正则
^thankyou.html没有定义捕获组(即()包裹的内容),所以$1是空值,实际重写路径为/thankyou/(带末尾斜杠) - 如果服务器上没有
/thankyou/这个目录,就会触发默认的首页跳转逻辑
完整的.htaccess示例
修正后完整的配置如下:
RewriteEngine On # 非www跳转至www RewriteCond %{HTTP_HOST} !^www.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # HTTP跳转至HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # URL改写相关规则(二选一) # 场景1:仅内部重写 # RewriteRule ^thankyou$ /thankyou.html [L] # 场景2:旧URL跳转+内部重写 RewriteRule ^thankyou.html$ /thankyou [L,R=301] RewriteRule ^thankyou$ /thankyou.html [L] <IfModule mod_expires.c> ExpiresActive On # Images ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/webp "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 year" ExpiresByType image/x-icon "access plus 1 year" # Video ExpiresByType video/webm "access plus 1 year" ExpiresByType video/mp4 "access plus 1 year" ExpiresByType video/mpeg "access plus 1 year" # Fonts ExpiresByType font/ttf "access plus 1 year" ExpiresByType font/otf "access plus 1 year" ExpiresByType font/woff "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" ExpiresByType application/font-woff "access plus 1 year" # CSS, JavaScript ExpiresByType text/css "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" # Others ExpiresByType application/pdf "access plus 1 year" ExpiresByType image/vnd.microsoft.icon "access plus 1 year" </IfModule>
内容的提问来源于stack exchange,提问作者user19906832
相关产品推荐
相关产品推荐

