【问题标题】:How do I redirect a URL that isn't found without sending a 404 header?如何在不发送 404 标头的情况下重定向未找到的 URL?
【发布时间】:2011-03-04 05:53:47
【问题描述】:

我的网站需要一个.htaccess 文件,当找不到页面时将用户重定向到index.php。但是,我不希望 Apache 在文档中发送 404 标头。

我之前问过这个问题: Apache .htaccess 404 error redirect

命令"ErrorDocument /index.php" 产生了我想要的确切效果,除了它与页面一起发送404 标头。我能做些什么?我应该用 PHP 覆盖 404 标头吗?

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    将此添加到您的 .htaccess 文件中:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    
    1. 启用重写
    2. 检查请求的文件是否作为具有大小(非空)的常规文件存在
    3. 检查请求的文件是否为链接
    4. 检查请求的文件是否为目录
    5. 如果前 3 条语句之一为真,则显示该文件
    6. 否则转到 index.php

    如果重定向到 index.php 发生,您可以通过在 index.php 中使用 $_SERVER["REQUEST_URI"] 来获取请求的 uri

    • '-d'(是目录)将 TestString 视为路径名并测试是否 它存在并且是一个目录。
    • '-f'(是常规文件)将 TestString 视为路径名并测试是否 它存在并且是一个常规文件。
    • '-s'(是具有大小的常规文件)将 TestString 视为路径名 并测试它是否存在并且是 大小大于的常规文件 零。
    • '-l'(是符号链接)将 TestString 视为路径名并测试是否 它存在并且是一个符号链接。
    • '-F'(通过子请求是现有文件)检查 TestString 是否为 有效文件并可通过所有 服务器当前配置的访问权限 控制该路径。这使用了一个 内部子请求来确定 检查,所以小心使用它,因为它 降低您的服务器性能!
    • '-U'(是通过子请求的现有 URL)检查 TestString 是否为 有效的 URL 并可通过所有 服务器当前配置的访问权限 控制该路径。这使用了一个 内部子请求来确定 检查,所以小心使用它,因为它 降低服务器的性能!

    更多信息:http://httpd.apache.org/docs/current/mod/mod_rewrite.html

    【讨论】:

    • 感谢您如此深入的回答。我找不到一个好的 htaccess 教程 - 你的回答非常清楚地解释了我正在寻找的一切。
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多