【问题标题】:.htaccess mod_rewrite won't skip RewriteRule with [S].htaccess mod_rewrite 不会使用 [S] 跳过 RewriteRule
【发布时间】:2012-03-28 19:31:58
【问题描述】:

作为一个仅供参考,我正在使用位于 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,我希望他们被重定向到 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/login 和 www.site.com/content/userlogin.php显示 www.site.com/content/error/404.php

【问题讨论】:

    标签: .htaccess mod-rewrite skip


    【解决方案1】:

    首先,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]
    

    希望对你有帮助

    【讨论】:

    • 这和你写的完全一样,谢谢。但是,根据我的特定应用程序,我遇到了一系列新问题,因此我会在认输之前尝试解决。干杯! (来自一个叫 Bjorn 的人)
    【解决方案2】:

    在您的代码中改用 %{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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多