【问题标题】:Redirect unavailable pages to 404 without changing URL在不更改 URL 的情况下将不可用的页面重定向到 404
【发布时间】:2014-11-24 21:15:32
【问题描述】:

我有一个隐藏文件夹hidden_folder 可以通过服务器访问

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ hidden_folder/$1

现在,我想将所有不可用的页面重定向到 404 错误页面内容。

插图1:当用户尝试去这里http://website.com/some_unavailable_uri时,页面的url不会改变,但内容将是/error/404.php之一

插图 2http://www.apple.com/test。该页面不存在,url不变,但内容显示错误。

基本上应该是if file does not exist, then redirect content。我尝试了一些方法,但没有成功。

第一次尝试:

RewriteEngine On
RewriteCond hidden_folder%{REQUEST_URI} -f   # %{REQUEST_URI} already has "/" at its beginning
RewriteRule ^.*$ error/404.php [NC,L]

第二次尝试:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}hidden_folder%{REQUEST_URI} -f
RewriteRule ^.*$ error/404.php [NC,L]

有什么想法吗?

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    看起来您只需要一个简单的ErrorDocument 并在目标中使用http://,因为这会导致浏览器中的 URL 发生变化。

    在 .htaccess 的顶部使用这一行:

    ErrorDocument 404 /error/404.php
    

    别忘了注释掉你的重写规则。

    【讨论】:

      【解决方案2】:

      条件也在重定向上进行测试,因此您必须确保 404 重定向不会捕获超出应有的范围。 这意味着%{REQUEST_URI} 在被重定向后将包含hidden_folder,因此您必须添加RewriteCond 以避免它。

      这应该可行:

      RewriteEngine On
      
      RewriteCond %{DOCUMENT_ROOT}/hidden_folder%{REQUEST_URI} !-f 
      RewriteCond %{REQUEST_URI} !^/hidden_folder
      RewriteRule ^(.*)$ error/404.php [L]
      
      RewriteCond %{REQUEST_FILENAME} !-f 
      RewriteCond %{REQUEST_FILENAME} !-d 
      RewriteRule ^(.*)$ hidden_folder/$1 [L]
      

      【讨论】:

      • 作为旁注,由于您不依赖 ErrorDocument,您的 404.php 应该发送 404 HTTP 标头。
      • 您没有提及对此的任何要求,但同样值得注意的是,使用此解决方案您仍然可以在 URL 中使用 hidden_folder 访问文件
      【解决方案3】:

      谢谢局外人。

      实际工作代码是:

      RewriteEngine On
      
      # If the requested file is not in hidden_folder as a file
      RewriteCond %{DOCUMENT_ROOT}hidden_folder%{REQUEST_URI} !-f
      
      # AND
      
      # If the requested file not is in hidden_folder as a folder
      RewriteCond %{DOCUMENT_ROOT}hidden_folder%{REQUEST_URI} !-d
      
      # AND
      
      # If the requested file is not in root as a file
      RewriteCond %{REQUEST_FILENAME} !-f
      
      # AND
      
      # If the requested file is not in root as a folder
      RewriteCond %{REQUEST_FILENAME} !-d
      
      # AND
      
      # ???    
      RewriteCond %{REQUEST_URI} !^/hidden_folder
      
      # THEN Redirect content
      RewriteRule ^(.*)$ error/404.php [L]
      
      ####################################################
      
      # Enable the deletion of hidden_folder in urls
      RewriteCond %{REQUEST_FILENAME} !-f 
      RewriteCond %{REQUEST_FILENAME} !-d 
      RewriteRule ^(.*)$ hidden_folder/$1 [L]
      

      【讨论】:

      • RewriteCond %{REQUEST_URI} !^/hidden_folder: 这个意思是“如果请求的路径不是以/hidden_folder开头”
      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2012-06-02
      • 2011-11-06
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多