Назад | Перейти на главную страницу

htaccess перенаправляет на url.php

Мне нужен следующий URL www.example.com/userprofile.php?username=username Чтобы www.example.com/username
Ниже мой файл htaccess

Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]

Когда я печатаю www.example.com/username имя пользователя GET отображается как

username.php

Я пробовал все, но не могу найти решения
Любая помощь приветствуется

Когда я печатаю www.example.com/username имя пользователя GET отображается как username.php

Потому что у вас есть перезапись ранее в файле:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

это переписывает /username (любой запрос, который не соответствует существующему файлу) в /username.php перед переписывая это на userprofile.php?username=username.php. Следовательно, почему вы видите значение параметра GET с .php суффикс.

Аналогичным образом следующие два RewriteRule директивы в настоящее время ничего не делают, так как предыдущее правило перехватывает запрос.

RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]

И они будут конфликтовать только с перезаписью "имени пользователя", если мы изменим предыдущую перезапись, добавив .php расширение. Но также эти два правила конфликтуют друг с другом - вы сопоставляете один и тот же URL-адрес с обоими - первое правило всегда будет выигрывать. (Один вход с двумя разными выходами невозможен ни в каком сценарии.) Фактически, это, скорее всего, приведет к возникновению цикла перезаписи.

Эти две директивы следует удалить.


Избегать .php добавляется к username, вы можете проверить, что .php Файл существует перед переписывая к нему. Например:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

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

www.example.com/u/username

Тогда ваша директива может быть написана менее двусмысленно (и не будет так зависеть от порядка директив в вашем файле):

RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]

Кроме того, будьте более конкретными в регулярном выражении, которое фиксирует имя пользователя. Шаблон .* захватывает что-нибудь. Например, если имена пользователей могут содержать только буквы a..z, используйте регулярное выражение, например ^u/([a-z]+)$. И если имя пользователя должно состоять из 4 или более символов, тогда: ^u/([a-z]{4,})$.