Мне нужен следующий 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,})$
.