将所有 http 请求重定向到 https 并将 index.php 附加到它

Posted

技术标签:

【中文标题】将所有 http 请求重定向到 https 并将 index.php 附加到它【英文标题】:To redirect all http request to https along with appending index.php to it 【发布时间】:2020-09-10 03:24:01 【问题描述】:

这是我当前的 htaccess 文件。

RewriteEngine On 
RewriteCond %REQUEST_FILENAME !-f 
RewriteCond %REQUEST_FILENAME !-d 
RewriteRule ^(.*)$ index.php?/$1 [L]
# Apache config
<FilesMatch ".(eot|ttf|otf|woff|php)">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

## EXPIRES CACHING ##
##<IfModule mod_expires.c>
##ExpiresActive On
##ExpiresByType image/jpg "access 1 year"
##ExpiresByType image/jpeg "access 1 year"
##ExpiresByType image/gif "access 1 year"
##ExpiresByType image/png "access 1 year"
##ExpiresByType text/css "access 1 month"
##ExpiresByType text/html "access 1 month"
##ExpiresByType application/pdf "access 1 month"
##ExpiresByType text/x-javascript "access 1 month"
##ExpiresByType application/x-shockwave-flash "access 1 month"
##ExpiresByType image/x-icon "access 1 year"
##ExpiresDefault "access 1 month"
##</IfModule>
## EXPIRES CACHING ##

我尝试添加

RewriteEngine On
RewriteCond %HTTPS !on$
RewriteRule ^(.*) https://%HTTP_HOST%REQUEST_URI [R=301,L]

但它不起作用。问题是根据当前的 htacess 文件,它将所有请求重定向到 index.php。 那么如何同时实现对 https 和 index.php 的重定向。 请帮我写代码。这将是一个很大的帮助

【问题讨论】:

这到底和php无关,请去掉那个标签。谢谢。 重定向必须在内部重写之前实现,所以在你的分布式配置文件(“.htaccess”)中更进一步。 @arkascha 谢谢。它解决了我的问题。我的问题的最终解决方案是RewriteEngine On RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule ^(.*)$ index.php?/$1 RewriteCond %HTTPS !=on RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301] 我写的重定向应该是之前实现的,所以上面内部重写了。你把它放在下面。这确实可行,但会导致额外的重定向。您可以使用 http 服务器的访问日志文件或浏览器控制台来确认。 是的,我看到了,我在评论中提到的上述代码无法正常工作。还有多个重定向。那么你能帮我写出正确的代码吗? 【参考方案1】:

这应该为您指明正确的方向:

RewriteEngine On 

RewriteCond %HTTPS !=on 
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [R=301,END] 

RewriteCond %REQUEST_FILENAME !-f 
RewriteCond %REQUEST_FILENAME !-d 
RewriteRule ^/?(.*)$ index.php?/$1 [END]

最好先从 302 临时重定向开始,稍后再将其更改为 301 永久重定向,前提是您确定一切都已正确设置。这样可以防止在尝试时出现缓存问题...

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的[END] 标志的明确提示。您可以尝试升级或使用旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此实现同样适用于 http 服务器主机配置或分布式配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用分布式配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用分布式配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是意外行为的原因,难以调试并且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

还有个人评论:请不要误会。但是这个问题看起来好像你从来没有费心去看你正在使用的工具的文档。为什么不?它是 OpenSource 的典型代表,具有卓越的品质,并提供了很好的示例:https://httpd.apache.org/docs/current/mod/mod_rewrite.html

【讨论】:

我尝试了上面给出的代码,它适用于 https 重定向,但由于这个原因,所有 POST 方法调用都停止了工作。由于这个原因,$_POST 变量总是为空。我是初学者。所以如果你能指导我,那就太好了 我怀疑你正在使用 URL 作为引用......所以像 ´
example.com/post.php">` 这样的东西至少可以解释什么你描述的?
是的。我的代码结构和你提到的一样。 那么你需要改变它。这没有道理。 事后 试图解决这个问题是行不通的。表单标签中的“动作”属性应该是相对路径或绝对路径。但不是 URL!

以上是关于将所有 http 请求重定向到 https 并将 index.php 附加到它的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有 HTTP 请求重定向到 HTTPS

将所有请求 HTTP 重定向到 HTTPS [重复]

Nginx反向代理:将所有http请求重定向到https

使用 Java Undertow 服务器将 HTTPS 请求重定向到 HTTP?

将所有 HTTP 和 HTTPS 请求重定向到单个 HTTPS URL

如何将所有请求重定向到 https)://www.domain name.tld/