【问题标题】:htaccess block original file however allow rewritehtaccess 阻止原始文件但是允许重写
【发布时间】:2022-01-23 22:47:13
【问题描述】:

我的 /.htaccess 中有以下条目

RewriteEngine On
RewriteBase /

RewriteRule ^signin.php - [L,gone]
RewriteRule ^sign-in/?$  /signin.php [L]

我想要实现的是允许用户访问/sign-in而不是原始文件/signin.php

我看到了另一个问题,但是当我尝试实现答案时,/sign-in/signin.php 都出现了 gone 错误。

参考问题: Alias within htaccess, and block access to original file? (URL rewriting)

感谢您的帮助。

【问题讨论】:

  • 您所描述的原因是重写引擎在向/sign-in 请求的情况下需要两次 次。您需要使用 END 标志而不是 L 标志来防止这种情况发生。
  • 我问自己:为什么要在此处发送“已消失”的标头?为什么不重定向客户端?
  • @arkascha 在这种情况下我将如何重定向用户?假设用户去了/signin.php,有没有办法将用户重定向到/sign-in
  • 当然有。实际上,这几乎是标准的。 SO 上的数百个现有答案恰恰证明了这一点。

标签: .htaccess


【解决方案1】:

要将/signin.php 的任何直接请求重定向到/sign-in 并在内部将/sign-in 重写回/signin.php,那么您可以这样做:

RewriteEngine On

RewriteRule ^signin\.php$ /sign-in [R=301,L]
RewriteRule ^sign-in$ signin.php [END]

END 标志 (Apache 2.4) 可防止重写引擎进一步循环,从而防止重写的 URL 被重定向回 /sign-in,否则会导致重定向循环。

第一条规则不需要END 标志,因为外部重定向将立即触发。 (L 标志仍然是必需的。)

这里不需要RewriteBase 指令。

我删除了/sign-in 上的可选尾部斜杠,因为这可能会产生重复的内容问题。如果您希望允许使用可选的尾部斜杠,则改为重定向到规范 URL(不带尾部斜杠,或者如果您愿意,也可以使用 )。


更新:

我看到了另一个问题,但是当我尝试实施答案时,/sign-in/signin.php 都出现了 gone 错误。

参考问题: Alias within htaccess, and block access to original file? (URL rewriting)

参考答案中的 Apache 解决方案并不完全正确。关于在 PHP 中执行此操作的第一部分的答案似乎已被“接受”。

在提出那个问题时(2011 年),他们可能一直在使用 Apache 2.2。 END 标志仅在 Apache 2.4 中引入。

他们需要这样做,以防止重定向循环:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^about.php /about [L,R=301]

RewriteRule ^about$ about.php [L]

【讨论】:

  • 我已通过对引用问题的简短分析更新了我的答案。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2013-05-28
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多