【问题标题】:htaccess 404 redirect does not workinghtaccess 404 重定向不起作用
【发布时间】:2016-07-21 06:25:23
【问题描述】:

我有一个 .htaccess 文件来管理我网站上的 rewrite_rules。我还设置了 404 重定向 命令,以便在访问者输入错误 URL 时将其导航到指定页面。但是这个重定向不起作用,如果访问者请求无效的 URL,我会得到 500 Internal Server Error。以下是我的部分代码:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$ index.php?lang=$1&page=$2&id=$3&des=$4 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(p[0-9]+)/?$ index.php?lang=$1&page=$2&pn=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&page=$2 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?lang=$1&page=home [NC,QSA,L]

ErrorDocument 404 http://www.mywebsite.com/404/

我的代码中缺少什么导致此问题?

【问题讨论】:

  • 请在第一行添加。重写引擎开启
  • @Alex 这只是我的 .htaccess 文件的一部分。它包含你所说的
  • @MohammadSaberi,每当 apache 出现 500 Internal Server Error 时,它总是会在其 error.log 中写入一些错误。您收到此错误后是否立即检查了该文件?我认为您应该将整个.htaccess 发给您,以便我们重现问题并找到解决方案。
  • 还有一件事。您能否展示完整的.htaccess“错误网址” 的示例?
  • @MohammadSaberi,你没听见吗?给我看你的完整的.htaccess。我很确定它有一个错误。尤其是在你的话之后:“/404/ 不是文件夹”。

标签: php apache .htaccess redirect http-status-code-404


【解决方案1】:

看到你所有的.htaccess 规则,罪魁祸首是:

RewriteRule ^(.*)$ $1 [NS,E=no-gzip:1,E=dont-vary:1]

给出您的示例 URL http://www.domain.com/en/news/1/something/test/,当 URL 与定义的规则不匹配时,它会命中最后一个重写规则并陷入无限循环:

applying pattern '^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/([^/]+)/(p[0-9]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^([^/]+)/?$' to uri 'en/news/1/something/test/'
...
applying pattern '^(.*)$' to uri 'en/news/1/something/test/'
...

然后我们有一个递归开始:

applying pattern '^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$' to uri 'en/news/1/something/test/'
...

虽然没有找到像 http://www.domain.com/en/news/1/wrong 这样的 URL,但它被定义的规则(第一条规则)捕获,我们没有遇到任何递归。因此,此内部错误不会在所有 not found 页面上引发,而是在规则未捕获的页面上引发。

我看的不对,删掉吧。

【讨论】:

  • 我在再次访问此页面之前找到了您的答案,您是否也找到了。谢谢,也感谢Spirit的关注和帮助
  • 不客气。如果您更加关心 cmets 和/或提供信息,您将收到早期答复。 @MohammadSaberi
  • @MohammadSaberi,恭喜! =)
【解决方案2】:

你应该放

<IfModule mod_rewrite.c>
    RewriteEngine On

在开始和

</IfModule>

在您的 .htaccess 代码的末尾

【讨论】:

  • 我在 .htaccess 文件中的所有代码都运行良好,特别是 mod_rewrite 规则。我的问题只是 404 重定向
【解决方案3】:

尝试将此规则添加到您的 htaccess 顶部:

RewriteEngine On
RewriteRule ^404/?$ /pages/errors/404.php [L]

然后在下面:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ http://domain.com/404/ [L,R]

【讨论】:

    【解决方案4】:

    您可以使用 EroorDocument 指令将不存在的请求转发到特定目的地

    在一个空的 .htaccess 文件中测试它

    ErrorDocument 404 /page.php
    

    【讨论】:

      【解决方案5】:

      检查下面的代码,我写了各种场景。

      ErrorDocument 404 http://example.com/404/
      ErrorDocument 500 http://example.com/500/
      # or map them to one error document:
      # ErrorDocument 404 /pages/errors/error_redirect.php
      # ErrorDocument 500 /pages/errors/error_redirect.php
      
      RewriteEngine On
      RewriteBase /
      
      RewriteCond %{REQUEST_URI} ^/404/$
      RewriteRule ^(.*)$ /pages/errors/404.php [L]
      
      RewriteCond %{REQUEST_URI} ^/500/$
      RewriteRule ^(.*)$ /pages/errors/500.php [L]
      
      # or map them to one error document:
      #RewriteCond %{REQUEST_URI} ^/404/$ [OR]
      #RewriteCond %{REQUEST_URI} ^/500/$
      #RewriteRule ^(.*)$ /pages/errors/error_redirect.php [L]
      

      【讨论】:

        【解决方案6】:

        您在 ErrorDocument 之后提到的 URL 似乎无效或无法访问。

        所以,发生的情况是,当它收到 404 时,它会重定向到您的 URL,然后再次收到 404。

        形成一个递归循环。 明白我的意思。 ?

        尝试使用简单的静态 html 页面。

        我希望这会奏效。

        【讨论】:

        • 绝对不是真正的 URL。这是错误 URL 的示例形式。
        【解决方案7】:

        如果您添加http://www.mywebsite.com/404/ 之类的域(这不是编码业力),自定义 404 将永远不会起作用,当您输入这样的 url 时,它将最终出现 500 错误。这意味着它执行了 404 但由于 htaccess 配置错误而将用户重定向到 500 错误。

        当一系列错误出现时,4XX 被称为客户端错误,5XX 被称为服务器端错误。有关详细信息,2XX 称为成功,3XX 称为重定向。

        所以这里是快速尝试(我假设你有 404 html 文件)

        ErrorDocument 404 /404.html 
        

        而不是

        ErrorDocument 404 http://www.mywebsite.com/404/
        

        我也曾在我身边测试过这段代码,它确实有效。请尝试

        RewriteEngine On
        RewriteBase /
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^([^/]+)/([^/]+)/([0-9]+)/([^/]+)/?$ index.php?lang=$1&page=$2&id=$3&des=$4 [NC,QSA,L]
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^([^/]+)/([^/]+)/(p[0-9]+)/?$ index.php?lang=$1&page=$2&pn=$3 [NC,QSA,L]
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&page=$2 [NC,QSA,L]
        
        ErrorDocument 404 /404.html
        

        【讨论】:

          【解决方案8】:

          试试这个:

          ErrorDocument 404 /404/
          

          【讨论】:

            【解决方案9】:

            尝试在重写之前添加

            RewriteEngine On
            

            【讨论】:

            • 你看过以前的 cmets 吗?
            猜你喜欢
            • 2013-01-30
            • 1970-01-01
            • 2011-12-01
            • 2018-02-18
            • 2014-04-20
            • 1970-01-01
            • 2015-09-25
            • 2011-03-13
            • 2015-03-07
            相关资源
            最近更新 更多