使用 Apache FallbackResource 指令避免重复的 URL

使用 Apache FallbackResource 指令避免重复的 URL

我正在使用 FallbackResource 指令通过前端控制器 /index.php 路由所有 Web 请求:

FallbackResource /index.php

它工作得很好,但有一件事困扰着我。事实上 /index.php 仍然可以直接使用 - 同一资源有两个 URL:

  • http://www.example.com/resource-path
  • http://www.example.com/index.php/resource-path

我希望 FallbackResource 能够处理这个问题,以便只有主 URL 可用,因为这可能会造成 SEO 问题。解决这个问题的最佳方法是什么?

答案1

我还没有在 Apache 中找到解决方案。我找到的唯一解决方案是在 PHP 中处理它,这几乎违背了使用它的初衷FallbackResource /index.php

if (preg_match('#^/index.php#', $_SERVER['REQUEST_URI'])) {
    $redirect = preg_replace('#^/index.php#', '', $_SERVER['REQUEST_URI']);
    if (empty($redirect)) {
        $redirect = '/'; // in case request is domain.com/index.php with no trailing slash
    }
    header('Location: ' . $redirect);
    exit;
}

这不是理想的解决方案,但它确实有效。奇怪的是,关于 的重复 URL 问题的信息太少了FallbackResource。不过,在我看来,这个解决方案还不够,所以我个人所做的就是回到 mod_rewrite

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^ %{ENV:BASE}/index.php [L]

希望这至少能帮到你。我试过悬赏,但似乎没人能回答。

相关内容