3

作为一个仅供参考,我正在使用以下 .htaccess 文件位于www.site.com/content/

当用户访问 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 的 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/ login和 www.site.com/content/ userlogin.php都显示 www.site.com/content/error/404.php

4

2 回答 2

2

首先,S=1 将不起作用,因为 L 指令将停止任何进一步的重写。似乎第一个 RewriteRule 使 Apache 再次通过 .htaccess 规则,因此您需要知道第一次重写是否发生。您可以通过设置这样的环境变量来做到这一点:

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

因此,当下一次重定向发生时,Environment 变量实际上会被重写REDIRECT_<variable>,您可以像这样对这个变量执行 RewriteCond:

RewriteCond %{ENV:REDIRECT_DONE} !true
RewriteRule ^userlogin\.php$ /content/error/404.php [NC,L]

希望这可以帮助

于 2012-03-28T22:18:39.767 回答
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]
于 2012-03-28T22:25:31.313 回答