.htaccess mod_rewrite不会跳过带[S]标志的RewriteRule

3
作为一条提示,我正在使用以下位于www.site.com/content/的.htaccess文件
当用户访问www.site.com/content/login时,我希望它显示来自www.site.com/content/userlogin.php的内容(通过重写进行掩盖,而不是重定向)- 我已经成功完成了这个操作:
RewriteEngine On
RewriteBase /content/
RewriteRule ^login/?$ /content/userlogin.php [NC,L]


然而,我想添加以下内容:如果他们尝试直接访问www.site.com/content/userlogin.php,我希望将其重定向到www.site.com/content/error/404.php的404页面。

RewriteEngine On
RewriteBase /content/
RewriteRule ^login/?$ /content/userlogin.php [NC,S=1,L]
RewriteRule ^userlogin\.php$ /content/error/404.php [NC,L]

在.htaccess文件中加入这段内容后,无论是www.site.com/content/login还是www.site.com/content/userlogin.php都会显示www.site.com/content/error/404.php。
2个回答

2

首先,当L指令执行时,S = 1将不起作用,因为它会使任何进一步的重写停止。

似乎第一个RewriteRule会让Apache再次遍历.htaccess规则,因此您需要知道第一个重写是否已发生。 您可以通过设置环境变量来实现这一点:

RewriteRule ^login/?$ /content/userlogin.php [E=DONE:true,NC,L]

所以,当下一次重定向发生时,环境变量实际上会被重写为REDIRECT_<variable>,您可以像这样对其进行RewriteCond条件限制:
RewriteCond %{ENV:REDIRECT_DONE} !true
RewriteRule ^userlogin\.php$ /content/error/404.php [NC,L]

希望这能有所帮助。

这个代码完全按照你编写的方式运行,谢谢。然而,基于我的特定应用程序,我遇到了一组新的问题,所以在承认失败之前,我会尝试解决它们。干杯!(来自Bjorn) - iverSUN

0

在您的代码中使用%{THE_REQUEST}变量:

RewriteEngine On
RewriteBase /content/

RewriteRule ^login/?$ content/userlogin.php [NC,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+userlogin\.php[\s\?] [NC]
RewriteRule ^ content/error/404.php [L]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接