作为一个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
答案 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]