【问题标题】:ErrorDocument redirect to different page per virtual directoryErrorDocument 重定向到每个虚拟目录的不同页面
【发布时间】:2014-08-18 17:37:34
【问题描述】:

我已尝试尽我所能查找此问题,但找不到此特定问题的直接答案。我对一些友好的 URL 有一些 .htaccess 重写规则,并希望处理可能以各种方式发生的 404 错误。

首先,这里有几个重写规则:

RewriteRule ^newsite/designer/([A-Za-z0-9_.%&-]+).html/?$ newsite/catalog.php?m=$1 [NC,L,B,QSA]
RewriteRule ^newsite/search/([A-Za-z0-9_.%'&-]+)/?$ newsite/catalog.php?kw=$1 [NC,L,B,QSA]

我想将 404 错误用于搜索 / 与设计器 / 中的 404 错误不同。每个人都有自己的目的地。但由于这些不是实际的目录,我不能只在目录中放置一个单独的 .htaccess 文件。

最终我希望所有其他 404 不被明确重定向到包罗万象,比如

ErrorDocument 404 /index.php

这可能吗?如何实现?

【问题讨论】:

  • 所以你想让/newsite/designer/blablabla 转到/newsite/designer-404.php 和类似地/newsite/search/blablabla/newsite/search-404.php
  • 不完全是。仅当 /newsite/designer/blablabla 的结果产生 404 错误时,我才希望它转到自定义错误页面
  • 是的,这就是我使用/blablabla 的意思(通常不存在)
  • 那么是的。主要的是,如果链接与重写规则不匹配,则当我得到 404 时。否则,它将作为变量传递给我的脚本,该脚本从那里处理它。这很可能只会发生在 /search/ 只是在链接不匹配的情况下尝试捕获。

标签: .htaccess redirect rewrite http-status-code-404 errordocument


【解决方案1】:

您可能可以在配置中使用<Location> 部分:

<Location /newsite/designer>
    ErrorDocument 404 wherever
</Location>

但是,在很多情况下,您可能无法获得 404(如果请求与 RewriteRules 匹配,并且在脚本中您找不到匹配项),具体取决于您的脚本的工作方式。

【讨论】:

  • 谢谢。我不知道。如果我按顺序添加了 3 个 语句,然后以一个没有结束,如果最后一个与位置不匹配,它会是默认的,还是会覆盖位置?
  • 我试过 并且它为整个站点产生了 500 服务器错误。我尝试了您的版本(替换“whatever”),然后尝试了我在 apache 网站上找到的一些版本。我猜我的服务器不喜欢
  • 您是否将 放在 部分中?我刚刚在我的服务器上尝试过它,它完全按预期工作。添加该代码时,日志中会显示什么?您使用的是什么版本的 Apache?
  • 不,我没有在 部分。还有什么需要环绕它的吗?这是我第一次看到这些命令。
  • 我不知道。在我的 Apache 配置中,我为每个虚拟主机都有一个专用的配置文件,只需在特定虚拟主机的现有 部分中添加上面的 3 行即可使其工作。当然,如果您使用虚拟主机。您可以测试 Apache 配置的有效性,而无需使用 apachectl configtest 重新启动它。并且不要忘记查看您的日志以确切了解问题所在!
【解决方案2】:

您可以使用这些重写规则:

RewriteEngine On

# specific 404 handlers
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^newsite/search/ /newsite/404.php?base=search [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^newsite/designer/ /newsite/404.php?base=designer [L,NC,QSA]

RewriteRule ^newsite/designer/([A-Za-z0-9_.%&-]+).html/?$ newsite/catalog.php?m=$1 [NC,L,B,QSA]
RewriteRule ^newsite/search/([A-Za-z0-9_.%'&-]+)/?$ newsite/catalog.php?kw=$1 [NC,L,B,QSA]

# generic 404 handling:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^newsite/designer/ /newsite/404.php [L,NC]

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2017-01-09
    • 2011-02-12
    相关资源
    最近更新 更多