Я хотел получить следующий 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,})$
.