Я не php парень, но я попробовал это переписать.
RewriteRule ^/(.+)/([^/]+)$ /index.php?p=$1&uid=$2 [L]
В этом случае для параметра p
вы ищете все символы до последнего слэша, поэтому первая часть этого требует ничего, в противном случае остановится на первом слэше (пользователи вместо пользователей /profile).
Затем он ищет слеш и сохраняет (не слэш). (.+)
будет жадным, поэтому до конца будет идти до последней косой черты.
Тогда мне пришло в голову, что последняя часть не должна избегать косых черт. Поскольку первая часть является жадной, явная косая черта /
будет последней. Так что это еще проще:
RewriteRule ^/(.+)/(.+)$ /index.php?p=$1&uid=$2 [L]
Мне нравится, что .+
требует чего-то, по крайней мере, когда это сначала выясняется. Если позже вы узнаете, что они могут быть необязательными, вы можете сделать .*
, но обычно это заканчивается на другой странице или на другом правиле.
Эти правила предполагают, что все URL будут в этом формате, о чем вы и просите. Но, возможно, это слишком чересчур, поэтому он может исключить URL, которые действительно имеют .htm, .php или что-то еще.
RewriteRule ^/(.+)/([^.]+)$ /index.php?p=$1&uid=$2 [L]
Это ищет что-нибудь до последней косой черты, затем что-нибудь без точки в нем. Если у него есть точка, это не будет применяться. Так что, если это «обычный» URL, это оставит его в покое. Это может помочь с проблемой 404, в случае, если страница 404 будет поймана этим.