Вы должны запрашивать "симпатичный" URL, т.е. /abcdefgh
. Ваша директива mod_rewrite в .htaccess
затем внутренне переписывает это в «реальный» URL, который фактически обрабатывает запрос (т. Е. /profile.php?id=$1
). Эта директива ожидает URL-адрес вида /abcdefgh
. Однако в его текущем состоянии следует ожидать цикл перезаписи:
- Запрос
/abcdefgh
- Запрос перезаписан на
/profile.php?id=abcdefgh
. - Обработка начинается заново. ..
- Запрос переписан на
/profile.php?id=profile.php
(поскольку регулярное выражение ^([^/]*)$
соответствует части profile.php
переписанного URL. - GOTO # 3
В этом примере вы можете избежать цикла перезаписи, просто сделав шаблон RewriteRule
(regex) более ограничительным, например, включив точку (.
) в отрицательный класс символов (предполагая, что ваш новый ")«красивые» URL-адреса не содержат точку).
Например:
RewriteRule ^([^/.]+)$ /profile.php?id=$1 [L]
Затем вам нужно фактически изменить URL-адреса на своем веб-сайте на новые «красивые» URL-адреса.
Однако, если вы в настоящее время получаете 404, то, возможно, эта директива вообще не обрабатывается? Включены ли файлы .htaccess
? Есть ли в вашем файле .htaccess
другие директивы?
ОБНОВЛЕНИЕ: в идентификаторе допускаются только символы AZ
В этом случае yВы должны быть более конкретными с регулярным выражением и соответствовать только необходимые символы. Это помогает избежать конфликтов и избавляет от необходимости проверок файловой системы (в некоторой степени), которые являются относительно «дорогими». Заметьте, однако, что вы указали «AZ», но ваш пример включает строчные буквы. Ради аргумента я предполагаю, что id
может включать в себя az и AZ.
Итак, теперь это становится:
RewriteRule ^([a-z]+)$ /profile.php?id=$1 [NC,L]
Никаких других проверок файловой системы (предшествующих директивам RewriteCond
)) необходимы. NC
(nocase
) делает совпадение с регулярным выражением без учета регистра.
Нет необходимости проверять, что запрос не сопоставляется с файлом (с предыдущим условием), поскольку регулярное выражение ^([a-z]+)$
никогда не может соответствовать файлу (который содержит расширение файла).
Также нет необходимости проверять, что запрос не сопоставляется с каталогом, если только вы не запрашиваете каталоги в корне документа напрямую - что являетсявероятно, "вряд ли". Однако в этом заключается внутренний конфликт с этой структурой URL. Если вам нужно было иметь доступ к каталогу, тогда эти имена каталогов становятся недействительными идентификаторами - поэтому вам понадобятся другие проверки в других местах вашей системы, чтобы убедиться, что не было сгенерировано идентификаторов, которые сопоставляются с физическими каталогами в корне документа.