Есть ли способ изменить URL-адрес php с помощью htaccess? - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь изменить:

example.com/profile.php?id=abcdefgh

На просто:

example.com/abcdefgh 

Я искал здесь в StackOverflow и понял, что мне нужно что-то сделать с моим .htaccess,Я попробовал этот код:

RewriteEngine On

RewriteRule ^([^/]*)$ /profile.php?id=$1 [L]

Но, похоже, ничего не меняется, когда набираешь этот URL (example.com/profile.php?id=abcdefgh), он не переписывается.

PS Не знаю, еслиприведенный выше код является верным, я попробовал его, потому что там, где я его получил, была похожая проблема с моим.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вы должны запрашивать "симпатичный" URL, т.е. /abcdefgh. Ваша директива mod_rewrite в .htaccess затем внутренне переписывает это в «реальный» URL, который фактически обрабатывает запрос (т. Е. /profile.php?id=$1). Эта директива ожидает URL-адрес вида /abcdefgh. Однако в его текущем состоянии следует ожидать цикл перезаписи:

  1. Запрос /abcdefgh
  2. Запрос перезаписан на /profile.php?id=abcdefgh.
  3. Обработка начинается заново. ..
  4. Запрос переписан на /profile.php?id=profile.php (поскольку регулярное выражение ^([^/]*)$ соответствует части profile.php переписанного URL.
  5. 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. Если вам нужно было иметь доступ к каталогу, тогда эти имена каталогов становятся недействительными идентификаторами - поэтому вам понадобятся другие проверки в других местах вашей системы, чтобы убедиться, что не было сгенерировано идентификаторов, которые сопоставляются с физическими каталогами в корне документа.

0 голосов
/ 24 октября 2019

Это должно работать.

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ profile.php?id=$1 [QSA,L] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...