У меня есть проект, работающий локально на 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
не используют это поведение?