- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经浏览了数十篇与此相关的文章,但没有一篇能解决我的问题,这让我一直很头疼。
这是我想要实现的目标:
1) 我有第二个域名,需要重定向到主域,同时保留 URL 的其余部分,
2) 所有文件都应该丢失 .php 扩展名,
3) 强制 WWW,
4) 强制使用 HTTPS。
现在的问题是我当前的 .htaccess 仅在主域中以这种方式工作,并且仅当满足 WWW 条件时。让我解释一下。
如果我输入 domain1.com/page 或 domain2.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.com
到 domain1.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/
是否可以在 .htaccess 中包含来自另一个 htaccess 文件的规则? .htaccess RewriteEngine On RewriteCond ... RewriteRule ...
我正在尝试做的事情: 在我的特定项目的服务器上,我想通过 htaccess 编写 URL 重写规则(从 URL 中删除 .php 或 .html 扩展名)。 我的网站网址: http://enacte
在我的 .htaccess 文件中我已经有一些重写条件和规则,并且它工作正常。 现在我需要将“http 到 https 重定向”添加到我的 htaccess 文件中。 这是我的旧 .htaccess
注意:我写了解决方案。不管怎样,谢谢你。 :) 我知道这似乎是重复的问题:我搜索了很多,我应用了数十条重写规则,但它们不起作用。 我需要从 重定向 www.domain.com/folder1 到 w
我有一个带有 drupal 的多站点,我创建了一个站点,该站点起初应该可以通过多种方式(子域和路径)访问,但现在我只想保留其中一个;所以我应该重定向所有其他人。现在我有: aaa.domain.com
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我将我的网站从/v1/etc... 目录移动到/v2/etc... 目录,并希望在 htaccess 中进行永久重定向。有人能帮我吗? 最佳答案 您可以使用 mod_rewrite : Rewrite
我想通过 .htaccess 保护文件夹。以下不起作用。它在浏览器中显示登录对话框,但看起来好像用户名和密码不匹配。当我将方法更改为 Basic 时,它运行良好。 AuthUserFile /home
任何人都可以解释以下行吗? RewriteRule ^(.*)$ /index.php/$1 [L] 最佳答案 重写规则的部分分解如下: 重写规则 表示此行将是重写规则,而不是重写条件或其他重写引擎指
我正在尝试从一个域中一个目录中的所有文件创建一个永久的 htaccess 重定向(301)到另一个域,如下所示: 重定向以下目录中的所有文件: http://www.primary.com/apple
我不是 .htaccess 的英雄,但我遇到了一个我认为可能是由它引起的问题。 第一个症状:对我的数据库的简单更改(如用户 IP 跟踪)每次请求都完成了多次,而站点的输出看起来还不错。 经过数小时的跟
我想做一个类似basecamp.com的东西:你公司的名字变成三级域名,http://mycompany.basecamp.com例如。我知道它(很可能)是在.htaccess文件和mod_rewri
我已阅读 this这对我的要求来说似乎太长了。 并尝试过 Redirect /index.php /index2.php但它不起作用(内部服务器错误) 我想要的是将我的一些 php 文件重定向到 in
如果使用此代码,则成功: Redirect 301 /products.php http://website.com.au/product_123.php 但是,如果执行此操作,则不是: Redire
我想重定向这个子域: http://abc.domain-name.com 到根域上使用相同名称的文件夹: http://www.domain-name.com/abc 这样,如果我尝试访问以下文件:
我已经在我的实时站点上设置了 htpasswd 身份验证,并且效果很好,但是当我在开发环境中工作时,我不想被要求输入密码。 在我的 httpd.conf 文件中,我有: SetEnv APP_ENV
之前 我安装了 SSL,一切运行良好!!这是我的根网络服务器 .htaccess 文件中的代码: Options +MultiViews RewriteEngine On RewriteCond %{
我要问一个非常简单的问题。当我运行我的页面时,我不希望我的链接显示这个: http://localhost/example/assets/gallery.php 我想要的是: http://local
我在 htaccess 中有说明,可以让所有请求都通过 index.php 文件。但它禁止访问文件夹和文件。因此,如果我尝试转到/uploads/products/thumbs/file.png 它会
我有一个这样的网址:https://example.com/coins/1&order_by=today以及几个类别,例如: https://example.com/coins/1&order_by=
我是一名优秀的程序员,十分优秀!