2 回答
TA贡献1784条经验 获得超8个赞
我发现这个有效:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L] #if not already index.php
RewriteCond %{REQUEST_FILENAME} !-f #only if NOT a FILE (directory / non-existent file)
RewriteRule . /index.php [L] #redirect to index.php
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*) https://www.example.com/%{REQUEST_FILENAME} [R=301,L] #redirect to https://www
</IfModule>
这不可能像所写的那样“工作”,因为存在许多错误:
您缺少打开
<IfModule mod_rewrite.c>
指令。然而,无论如何,这个<IfModule>
包装都不是必需的,应该被删除。Apache 不支持行结束注释。具体来说,以下行将由于“错误的标志分隔符”而导致 500 错误:
RewriteCond %{REQUEST_FILENAME} !-f #only if NOT a FILE (directory / non-existent file)
(更新:如果您在此处没有看到 500 错误响应,则您可能使用的是 LiteSpeed 服务器;而不是 Apache?在 LiteSpeed 上,此行尾注释似乎按预期工作!)
www
除了对目录(包括根目录)或真实文件(除了index.php
)的请求之外,重定向到的外部重定向(最后)永远不会被处理。在现有重写之前,需要先进行此重定向。然而,请看下一点......您在目标 URL 中错误地使用了
REQUEST_FILENAME
(绝对文件系统路径) - 这将导致格式错误的重定向。您可以使用REQUEST_URI
服务器变量(完整的 URL 路径),但请注意,您还存在双斜杠问题。因此,它需要像下面这样重写:RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]
小要点:
RewriteBase
这里没有使用它,可以安全地删除。(除非你有其他指令使用这个?)
概括
综合以上几点我们有:
RewriteEngine On
# Redirect to https://www
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Stop here if already index.php
RewriteRule ^index\.php$ - [L]
# Only if NOT a FILE (non-existent file)
RewriteCond %{REQUEST_FILENAME} !-f
# Rewrite to index.php (in the document root)
RewriteRule . /index.php [L]
请注意,这仍然会将目录重写为,与您的评论/index.php所述相反。
首先使用 302(临时)重定向进行测试以避免潜在的缓存问题。
在测试之前您需要清除浏览器缓存。
TA贡献1853条经验 获得超18个赞
经过大量的修改/研究,我发现这个有效:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L] #if not already index.php
RewriteCond %{REQUEST_FILENAME} !-f #only if NOT a FILE (directory / non-existent file)
RewriteRule . /index.php [L] #redirect to index.php
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*) https://www.example.com/%{REQUEST_FILENAME} [R=301,L] #redirect to https://www
</IfModule>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
- 2 回答
- 0 关注
- 82 浏览
添加回答
举报