htaccess 阻止原始文件但允许重写

htaccess block original file however allow rewrite

我的 /.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)

感谢您的帮助。

要将对 /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( 不带 尾部斜杠,或者 with 如果您愿意) 代替。


更新:

I saw this other question however when I tried to implement the answer I get gone error on both /sign-in and /signin.php.

Referenced Question: 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]