Поэтому я пытаюсь использовать переписывание URL, чтобы упростить URL на веб-сайте.
Пример использования:
www.example.com/test -> www.example.com/index.php?page=test
www.example.com/test/x -> www.example.com/index.php?page=test&value=x
Я использую это для переписывания:
RewriteEngine on
#Simplify url
RewriteRule ^(\w+)/?$ index.php?page=$1
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1
Проблема в том, что этот подход, похоже, сохраняет местоположение до перезаписи. Таким образом, другие файлы, загруженные на веб-сайт, например CSS, относятся к исходному местоположению, а не к местоположению после перезаписи.
Пример:
www.example.com/test/x
переписывает
www.example.com/index.php?page=test&value=x
,
Но CSS файлы загружаются при входе пользователя www.example.com/test/x
загружены относительно /test/
папка, а не /
папка. Так что они не найдены.
Я что-то делаю неправильно? Я предполагал, что переписывание буквально перенаправит, поэтому такие вещи не будут проблемой. Я хотел бы решить эту проблему, а не просто использовать абсолютные URL-адреса для всего — поэтому я все еще могу использовать его на своем тестовом сервере.
Важно помнить, что переписывание — это не то же самое, что перенаправление. Браузер не знает о происходящем переписывании; он просто видит структуру папок, как кажется.
Относительные URL для ресурсов сайта разрешаются браузером. Итак, если вы получите доступ www.example.com/test/x
и браузер видит <link href="style.css">
естественно это читается как www.example.com/test/x/style.css
и пытается запросить этот файл, только чтобы получить 404.
Одно из распространенных решений — всегда использовать абсолютные URL, такие как www.example.com/style.css
, Скорее всего, вы бы сохранили URL своего сайта как константу и использовали <link href="<?php echo SITE_URL; ?>/style.css">
,
1)
В абсолютных URL нет ничего плохого. Ты можешь использовать определять.
Для среды разработки используйте:
define('BASE_URL', 'http://test.server.local/');
тогда для производственной среды просто измените его на:
define('BASE_URL', 'http://www.example.com/');
На всех страницах Вашего кода Вы можете получить доступ к этим URL-адресам как
<a href="<?=BASE_URL.'test/x'?>">x page</a>
Таким образом, вам не нужно менять код на всех страницах, где вы ссылаетесь на BASE_URL
2)
Это хорошая идея, чтобы поместить все ваши CSS в каталог styles /, а затем в .htaccess
файл вы можете исключить его из переписывания как это:
RewriteEngine on
# add this line:
RewriteRule ^/?styles/.+$ - [L]
#Simplify url
RewriteRule ^(\w+)/?$ index.php?page=$1
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1
ОБНОВИТЬ (относительно Вашего комментария)
Если вы используете концепцию BASE_URL
правильный URL-адрес создается на сервере, а затем передается в браузер. Если вы используете <base>
Вы зависите от клиентской части (браузер, который использует пользователь). Это хорошая практика для использования BASE_URL
на стороне сервера, таким образом, вы не будете зависеть от браузера клиента.
Проверьте этот ответ: Рекомендуется ли использовать base
HTML-тег?
Вы также можете включить файл php (который имеет define()
функция) на все ваши страницы, поэтому нет необходимости использовать <base>
на каждой странице. Вот хороший пример использования этого.