Перезапись URL в Apache с сохранением старого каталога?

Поэтому я пытаюсь использовать переписывание 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-адреса для всего — поэтому я все еще могу использовать его на своем тестовом сервере.

1

Решение

Важно помнить, что переписывание — это не то же самое, что перенаправление. Браузер не знает о происходящем переписывании; он просто видит структуру папок, как кажется.

Относительные 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

Другие решения

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> на каждой странице. Вот хороший пример использования этого.

1

По вопросам рекламы [email protected]