.htaccess mod_rewrite不会跳过RewriteRule [S]

时间:2012-03-28 19:31:58

标签: .htaccess mod-rewrite skip

作为一个FYI,我使用位于www.site.com/content/的以下.htaccess文件

当用户访问www.site.com/content/ 登录时,我希望它显示来自www.site.com/content/ userlogin.php 的内容(通过重写掩盖,而不是重定向) - 我已经成功完成了这样做:

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


但是,我想补充一下:如果他们试图直接访问www.site.com/content/ userlogin.php ,我希望将它们重定向到404网页:www.site.com/content/error/404.php

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/ 登录和www.site.com/content/userlogin.php显示www.site.com/content/error/404.php

2 个答案:

答案 0 :(得分:2)

首先,S = 1将没有任何功能,因为L指令将进行任何进一步的重写停止。 看起来第一个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]

希望这有帮助

答案 1 :(得分: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]