我有一个在WampServer上本地运行的项目。它采用类似MVC的结构,将URL重写为index.php?url=$1
。完整的.htaccess
文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
当我想使用PHP的location: <location>
将用户发送到另一个页面时,由于重写(尽管我技术上始终位于index.php
),它无法正确执行此操作。
例如,如果我在http://localhost/project_name/controller/method/
上,并且该控制器的构造函数或方法试图将我发送到:
header('location: another_controller/method');
会将我发送到http://localhost/project_name/controller/method/another_controller/method/
header('location: /another_controller/method');
会将我发送到http://localhost/another_controller/method/
但我希望它像这样将我发送:
header('location: /another_controller/method');
会将我发送到http://localhost/project_name/another_controller/method/
现在我找到的唯一解决方案是:
define('BASE_URL','http://localhost/project_name');
header('location: '.BASE_URL.'/another_controller/method/');
但这也不完美,因为每当域名或文件夹名称更改时,我都必须更改此定义常量 BASE_URL
。 我也可以在我的 BaseController
中创建一个方法来创建绝对URL,但是该方法基本上只会添加 BASE_URL
。
注意: HTML的 src
和 href
属性没有相同的问题,它们可以使用相对路径(路径中不带project_name
文件夹)。 但我不明白为什么。 因为如果标题 location
会导致浏览器将相对URL附加到当前位置,那么查找 .css
或 .js
文件时为什么没有相同行为。
所以...这引发了我几个问题:
- 如果我有虚拟主机,我会遇到这个问题吗?
- 最佳解决方案是什么?
- 最好只使用完整的绝对URL吗?
- 为什么HTML的
src
和href
属性没有共享此行为?
header('location: /');
仍然会跳转到http://localhost/
而不是http://localhost/project_name/
。 - kgongonowdoeheader('location: another_controller/method');
会将我发送到http://localhost/project_name/controller/method/another_controller/method/
”。我想指出的是,这种情况始终如此——你忘记了前导斜杠。没有前导斜杠,它将始终是一个相对重定向,从当前URL开始。不确定这是否是打字错误或完全无关,但我想指出来。 - Nate I