我不能 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://www.example.com/index.php他们收到了 404 错误。
- 当用户导航至http://www.example.com甚至http://www.example.com/home它们最终出现在我的首页上。
- 当用户导航到时,
http://www.example.com/<anything else>
他们要么最终进入我的主页(使用重定向到时/
),要么进入无限重定向循环(使用重定向到时/home
)。
我想要改变的是:
当用户访问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 部分,而不是整个包,所以我不必担心文件会因更新而被覆盖。