2 回答
TA贡献1834条经验 获得超8个赞
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^$ http://example.com/index.php [L,R=301]
是的,这是一个外部重定向,从 重定向http(s)://example.com/到http://example.com/index.php。但是,您正在重定向到 HTTP,而不是 HTTPS,并且您正在重定向到index.php,而您index.html在问题中已说明。似乎不需要检查请求的主机名,除非您有多个域并且特别只想重定向一个实例。
除非您计划实施 HSTS,否则请在您的常规 HTTP 到 HTTPS 重定向之前包含此重定向,并在您的 HTTP 到 HTTPS 重定向中包含规范主机名。
例如:
RewriteEngine On
# Redirect / or /index.html TO /dir/index.html (HTTPS)
RewriteRule ^(index\.html)?$ https://example.com/dir/index.html [R=302,L]
# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://example.com%{REQUEST_URI} [R=302,L]
但是,在阅读您的链接问题后,外部“重定向”可能不是您问题的正确解决方案。当您应该链接到子目录中的文件时,听起来您可能“错误地”链接到文档根目录中的文件?(真的,如果是这种情况,您应该更正您的内部链接……)但是,一个可行的解决方案可能是在内部将请求重写为所需的 URL 路径,或者DirectoryIndex如果您链接到文档根目录,则更改 。这对用户/客户端是完全隐藏的——用户只能看到 URL A,但实际上您在提供 URL B。但这取决于您网站的结构。
另一方面,外部重定向实际上将用户/浏览器发送到 URL B。他们同时看到 URL A(他们点击的链接)和 URL B(他们被重定向到的 URL)——就像搜索引擎机器人一样. 浏览器需要发出两个请求。这对用户来说可能会更慢,并且会在您的服务器上进行更多工作(不多,但仍然更多)。
TA贡献2012条经验 获得超12个赞
你想先做你的 http --> https 因为这同时适用于原始和重定向以进行安全通信。
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] Header always set Content-Security-Policy "upgrade-insecure-requests;"
现在您可以将重定向应用到index.php
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} -d RewriteRule . /index.php [L] </IfModule>
您可以调整-f
和-d
包含!
和/或更改文件名类型以满足您的特定需求。
添加回答
举报