【问题标题】:How to get .htaccess to attach REQUEST_URI to 404 page如何让 .htaccess 将 REQUEST_URI 附加到 404 页面
【发布时间】:2013-01-26 01:52:55
【问题描述】:

有没有办法将请求 URI 作为 URL 变量发送到 404 页面?例如,如果我用ErrorDocument 指令转发我的404,有没有办法做这样的事情?这是我尝试过的代码,但显然没有用。

ErrorDocument 404 /pages/errors/index.php?e=404&url=%{REQUEST_URI}

我也尝试了 mod_rewrite,但我也无法让它工作。这是我用 mod_rewrite 尝试过的:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /pages/errors/index.php?e=404&url=%{REQUEST_URI} [L,R=404]

基本上我要做的就是当用户输入类似http://mysite.com/asdf 的内容时,它会转发到http://mysite.com/pages/errors/index.php?e=404&url=/asdf,假设服务器上不存在目录/asdf

有没有简单的方法来实现这一点?

【问题讨论】:

  • 您可以尝试使用重定向然后检查 404 php 上的引荐来源吗?
  • 我试过了,$_SERVER['REQUEST_URI'] 但都没有成功,他们都只是空白。

标签: php .htaccess mod-rewrite errordocument


【解决方案1】:

如果您的问题与此有关,我认为您不必将任何其他信息传递给错误处理程序脚本。 Apache 提供了足够的信息:

重定向到另一个 URL 可能很有用,但前提是可以传递一些信息,这些信息可以用来更清楚地解释或记录错误情况。

为了实现这一点,当发送错误重定向时,将设置额外的环境变量,这些环境变量将从提供给原始请求的标头中生成,方法是在原始标头名称前加上“REDIRECT_”。这为错误文档提供了原始请求的上下文。

例如,除了更常见的环境变量之外,您可能还会收到以下内容。

REDIRECT_HTTP_ACCEPT=/, image/gif, image/jpeg, image/png

REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8

REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin

REDIRECT_QUERY_STRING=

REDIRECT_REMOTE_ADDR=121.345.78.123

REDIRECT_REMOTE_HOST=client.example.com

REDIRECT_SERVER_NAME=www.example.edu

REDIRECT_SERVER_PORT=80

REDIRECT_SERVER_SOFTWARE=Apache/2.2.15

REDIRECT_URL=/cgi-bin/buggy.pl

REDIRECT_ 环境变量是根据重定向之前存在的环境变量创建的。它们使用 REDIRECT_ 前缀重命名,即 HTTP_USER_AGENT 变为 REDIRECT_HTTP_USER_AGENT。

REDIRECT_URL、REDIRECT_STATUS 和 REDIRECT_QUERY_STRING 保证被设置,并且只有在错误条件之前它们存在时才会设置其他标头。

如果 ErrorDocument 目标是外部重定向(任何以类似 http: 的方案名称开头的东西,即使它与服务器引用同一主机),这些都不会设置。

查看link

【讨论】:

    【解决方案2】:

    我认为您需要删除 R=404。这对我有用;

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php?e=404&url=%{REQUEST_URI} [L]
    

    测试:foo/index.phpprint_r($_GET)

    localhost/foo -> Array ( )

    localhost/foo/asdf -> Array ( [e] => 404 [url] => /foo/asdf )

    【讨论】:

    • R=404 标志会导致 substitution 被忽略,并会触发对 Apache 404 错误文档的内部子请求。
    【解决方案3】:

    您第一次尝试将%{REQUEST_URI} 放入ErrorDocument 指令现在应该可以在最新版本的Apache 中使用。来自https://httpd.apache.org/docs/2.4/mod/core.html#errordocument

    从 2.4.13 开始,可以在指令内部使用表达式语法来 生成动态字符串和 URL。

    【讨论】:

      【解决方案4】:

      我有另一个想法,既然你使用的是 php,为什么不直接访问$_SERVER['HTTP_REFERER']。这向您显示了上一个页面请求,因此可能正是您正在寻找的内容。从那里,您可以使用该值做您想做的事。这行得通吗?

      【讨论】:

      • 我试过了 $_SERVER['REQUEST_URI'] 但都没有成功,结果都是空白。
      • @danL 阅读了这条评论,我没有对这条评论发布“答案”,而是在 pastebin 中输入了一些代码,以解决您的 $_SERVER 问题。pastebin.com/c5U6bTMc
      • 我实际上是通过使用 $_SERVER['REDIRECT_URL'] 让它工作的。不过谢谢!
      【解决方案5】:

      您已经通过 rewritecond 检查文件/文件夹在重写之前是否存在,您不需要在重写规则中使用请求 uri 并通过 $_SERVER['REQUEST_URI'] 处理它

      Options +FollowSymLinks
      RewriteEngine On
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule .* /pages/errors/index.php?e=404 [L,R=404]
      

      【讨论】:

        【解决方案6】:

        终于搞定了,虽然有点不合常规。我在 ColdFusion 而不是 PHP 上运行,不幸的是,这里的其他答案对我不起作用。但我认为这适用于任何人,无论他们的服务器端平台如何,因为它是基于 javascript 的:

        在 .htaccess 中:

        ErrorDocument 404 /mark404.cfm
        

        在 /mark404.cfm 中

        <script>
           window.location = '/handle404.cfm';
        </script>
        

        在 /handle404.cfm 中

        <script>
            var r = document.referrer;
            //this is what you want, the url that the user tried to hit
        </script>
        

        之所以可行,是因为浏览器在遇到 mark404 时仍然“认为”它位于请求的 doesntexist.html 上。所以当你重定向到handle404时,doesntexist.html在浏览器历史中,javascript可以把它捡起来。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-03
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 2013-03-11
          • 2011-12-05
          • 2018-05-13
          • 1970-01-01
          相关资源
          最近更新 更多