.htaccess сократить URL-адрес, используя php $_GET

Мне нужно укоротить мою страницу:

mydomain.com/mixtape.php?mixid=(WHATEVER NUMBER)

To:

mydomain.com/m/(WHATEVER NUMBER)

Теперь, как правило, для меня это не проблема, но из-за нескольких ранее существовавших функций в моем файле .htaccess очень сложно, чтобы эта функция не могла неправильно взаимодействовать с другими.

Ниже приведен текущий код моего файла .htaccess(И НЕ ИЗМЕНЯЕТСЯ)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$ profile.php?user=$1 [L]

Выше, файл .htaccess замыкает мои

mydomain.com/profile.php?username=(USERNAME)

к

mydomain.com/(USERNAME)

Есть ли там кто-нибудь, чем может мне помочь, имея возможность сократить mid-index.php? mixid и не конфликтует с уже существующей функцией?

2 ответа

Подготовить это правило к блоку .htaccess, переписывая URL-адрес профиля (после включения механизма перезаписи):

RewriteCond $1 ^m/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ mix.php?id=$1 [L]

Теперь это правило будет использоваться только для URL-адресов: mydomain.com/m/(WHATEVER NUMBER)

  • Первая строка - это условие, что входящий URL-адрес должен начинаться с m/
  • Вторая и третья строки - это условия, при которых входящий URL-адрес не представляет собой фактический файл или папку (мы не хотим, чтобы наше скромное правило перезаписи блокировало нас от реального ресурса).
  • Четвертая строка - это фактическое правило, которое использует синтаксис регулярного выражения для сопоставления и записи всего, что появляется после имени хоста, и передает его в файл mixtape.php в качестве параметра GET с именем id. Эта строка также содержит флаг [L], который гласит, что больше не будет никаких правил или перезаписи на текущий входящий URL-адрес.

В файле mix.php вы можете использовать метод explode, чтобы разбить результирующую строку на массив:

http://example.com/m/foo/bar = > `http://example.com/mixtape.php?id=/m/foo/bar

$splitArr = explode('/',$_GET['id']);
$splitArr =>
array (
 0 => 'm',
 1 => 'foo',
 1 => 'bar',
)

и удалите начальную m с помощью

array_shift();

Затем вы остаетесь с $splitArr, содержащим все части вашего URL-адреса, разделенные разделителем / (slash).

URL example.com/m/foo/bar будет выглядеть так:

array (
 0 => 'foo',
 1 => 'bar',
)

Важно разместить это правило до существующего, поскольку существующее правило будет действовать на любой входящий URL. Последние два правила, которые у вас есть, должны выглядеть следующим образом:

RewriteEngine on
RewriteCond $1 ^m/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ mix.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$ profile.php?user=$1 [L]

Относительно вашего утверждения:

И НИ ОДНО ИЗМЕНЯЕТСЯ

Я бы серьезно рекомендовал рассмотреть возможность внесения небольшого изменения в это первое правило. Создание окончательного URL-адреса как mydomain.com/users/(USERNAME) (как они здесь). В этих случаях гораздо лучше быть более конкретным, чем чрезмерно общим (в соответствии с действующим правилом). Считаете ли вы путаницу, которая может быть создана, если кто-то должен был выбрать имя пользователя, например:

  • о
  • чаво
  • дома

В то время как совершенно допустимые имена пользователей, эти профили пользователей были бы следующими:

  • mydomain.com/about
  • mydomain.com/faq
  • mydomain.com/home

Эти имена пользователей блокируют важные URL-адреса, которые вы можете сохранить для других мест на вашем сайте. Я думаю, что понятно, почему эти имена пользователей будут нежелательными.


RewriteRule ^m/([0-9]+)$ /mixtape.php?mixid=$1

Вставьте до или после существующего правила. Не должно вызывать конфликтов.

licensed under cc by-sa 3.0 with attribution.