htaccess перенаправление на url.php

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

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

решение1

Когда я ввожу 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]

И они будут конфликтовать только с переписыванием "username", если мы изменим предыдущее переписывание, добавив расширение .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,})$.

Связанный контент