Apache 重定向到 /index.php - 如何处理对 /index.php 的直接请求

Apache 重定向到 /index.php - 如何处理对 /index.php 的直接请求

我不能 100% 确定这应该是服务器故障还是堆栈溢出,但我更倾向于服务器故障。

大多数 PHP 框架都利用 Apache 重定向将所有请求引导至/index.php,然后框架会从那里处理路由。我遇到的问题是,我们的旧网站没有使用这种方法,而且/index.php实际上是我们的主页。现在我们发布了一个新网站,我们希望将所有直接请求重定向/index.php/home

我觉得我记得 Apache 中有一个开关或类似的东西,只有当前请求不是另一个 301 重定向的结果时才会执行重定向。但我似乎找不到类似的东西。这是我编造的吗?如果是我,有没有什么办法可以处理这种情况?

我已将 Apache 配置文件精简到最低限度,以消除未知重定向的可能性。如下所示(尽管域名已被删除):

##
# Some LoadModule includes
##

## Set the IP and ports for this server
Listen 10.0.15.246:80

## zend fastcgi
AddType application/x-httpd-php .php
AddHandler fastcgi-script .php

<VirtualHost *:80>

    ## Set various vhost values
    ServerName www.example.com
    DocumentRoot /www/www.example.com/htdocs/public
    DirectoryIndex index.php

    ##Set development environment
    SetEnv WEB_ROOT /www/www.example.com/htdocs/public
    SetEnv APPLICATION_ENV development

    RewriteEngine On

    ## My attempts to redirect /index.php to either / or /home
    #RewriteRule /index.php$ /home [R=301,NC,L]
    #RewriteRule /index.php$ / [R=301,NC,L]

    <Directory /www/www.example.com/htdocs/public>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all

    </Directory>

</VirtualHost>

我有一个.htaccess位于的文件,/htdocs/.htaccess其中完全是空白的。
我还有一个.htaccess位于的文件,/htdocs/public/.htaccess其中只包含以下内容,没有其他内容:

RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size
# fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

当前发生的情况:

我想要改变的是:

  • 当用户访问http://example.com/index.php它们最终出现在我的首页上。

  • 当用户导航到该页面时http://www.example.com/<anything else>,会转到相应的页面(如果不存在,则会出现 404 错误)。

答案1

我在 Apache 中找不到可以阻止对之前已重定向的现有请求进行重定向的标志/开关。

相反,我希望在应用程序本身内实现解决方案。

例如,由于我的应用程序是 Zend Framework 2 应用程序,我的解决方案是将其添加到 /htdocs/public/index.php 文件中:

if(trim($_SERVER['REQUEST_URI']) === '/index.php'){
    header("Location: /home",TRUE,301);
    die();
}

这不是最干净的解决方案。但我只包含我需要的 ZF2 部分,而不是整个包,所以我不必担心文件会因更新而被覆盖。

相关内容