gpt4 book ai didi

.htaccess 在重定向前满足 www/ssl 规则

转载 作者:行者123 更新时间:2023-12-03 08:01:44 25 4
gpt4 key购买 nike

我已经浏览了数十篇与此相关的文章,但没有一篇能解决我的问题,这让我一直很头疼。

这是我想要实现的目标:
1) 我有第二个域名,需要重定向到主域,同时保留 URL 的其余部分,
2) 所有文件都应该丢失 .php 扩展名,
3) 强制 WWW,
4) 强制使用 HTTPS。

现在的问题是我当前的 .htaccess 仅在主域中以这种方式工作,并且仅当满足 WWW 条件时。让我解释一下。

如果我输入 domain1.com/pagedomain2.com/page,它将打开 https://www.domain1/2.com/page.php 但它应该只是没有 .php 的 /page

如果我输入 www.domain1.com/page,它将打开 https://www.domain1.com/page - 预期行为,
但如果我输入 www.domain2.com/page,它将打开 https://domain1.com/page.php

我如何确保 HTTP/HTTPS 和 WWW/非 WWW domain1.com/domain2.com 的任何组合始终重定向到 https://www.domain1.com/page

我也很高兴收到任何 php 代码建议,我可以将每个 .php 文件的顶部自动重定向到无扩展版本,但我真的很想了解为什么我的 .htaccess 不起作用。

代码如下:

## Main Rules
Options +FollowSymLinks
RewriteEngine On
RewriteBase /

## Redirect Domain2.com to Main
RewriteCond %{HTTP_HOST} ^www\.domain2\.com [NC]
RewriteRule ^(.*)$ https://www.domain1.com/$1 [R,L]

## Remove .php Extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

## Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Force WWW
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ErrorDocument 404 /404

非常感谢!

最佳答案

您的指令顺序错误。重要的是,通过内部重写(您标记为“删除 .php 扩展”)附加 .php 扩展的规则应该放在最后, 外部重定向之后。您的重写是将 .php 附加到请求的 URL,即。 page 变为 page.php 并且然后您将触发外部重定向,这自然会暴露底层文件名。

但是,您的指令将导致多次重定向,并且可以简化。例如,最后一个重定向没有规范化协议(protocol)(并且对之前的规则的回复已经做到了这一点)。

例如:

ErrorDocument 404 /404

## Main Rules
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

## Redirect Domain2.com to Main
RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com [NC]
RewriteRule (.*) https://www.domain1.com/$1 [R,L]

## Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Force WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## Append .php Extensions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*) $1.php [L]

如果您无意实现 HSTS,那么您应该反转“强制 HTTPS”和“强制 WWW”规则,以避免在请求 http://domain1.com/page.

请注意,您从 domain2.comdomain1.com 的初始重定向是 302(临时)重定向。

更新:请注意,MultiViews 也应该被禁用,如果尚未禁用的话。例如:

Options +FollowSymLinks -MultiViews

如果启用了 MultiViews,那么这也会导致第一次重定向暴露文件扩展名,因为 mod_negotiation 会在 mod_rewrite 处理要求。但是,如果启用了 MultiViews,那么这也意味着附加 .php 扩展名的最终重写规则被有效地绕过了(因为第二个条件总是会失败,除非 page.php.php 存在。)。

在禁用 MultiViews 的情况下,这会突出显示最终重写的潜在错误。因为 /page/foo 的请求,其中 /page.php 作为实际文件存在(如您的示例)将导致 500 内部服务器错误,原因是重写循环。要更正此问题,应将附加 .php 扩展名的最终重写规则更改为以下内容:

## Append .php Extensions
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

(无需检查请求不是目录并且是文件,因为它永远不可能两者都是。)

关于.htaccess 在重定向前满足 www/ssl 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60264937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com