.htaccess Правило перезаписи нескольких страниц

#apache #.htaccess #mod-rewrite #url-rewriting #friendly-url

#apache #.htaccess #мод-перезапись #url-переписывание #дружественный url

Вопрос:

Уже несколько часов пытаюсь разобраться с этим, но не получается.

У меня есть сайт www.example.com/user.php?username=john Я использую .htaccess , чтобы сделать это красиво, вот так www.example.com/user/john Я использую следующее .htaccess правило перезаписи, и оно работает

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*/([a-zA-Z0-9_-] )|([a-zA-Z0-9_-] ))$ ./user.php?username=$1 [L]
  

Проблема

У меня есть страница профиля, подобная www.example.com/profile.php?username=john Я также использую следующее .htaccess , чтобы сделать его хорошо выглядящим, например www.example.com/profile/john

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*/([a-zA-Z0-9_-] )|([a-zA-Z0-9_-] ))$ ./profile.php?username=$1 [L]
  

Теперь это вообще не работает, но когда я удаляю первое правило перезаписи (правило user.php ) и поместите его после второго правила перезаписи (rule profile.php ) страница моего профиля работает, и наоборот,

Так что, по сути, любое правило, которое я ставлю первым, определяет, к какой странице я могу получить доступ с помощью своего URL.

Мне нужно, чтобы это работало для обеих страниц. Я соглашусь с вами, что я не близок к уровню новичка в .htaccess перезаписи.

Заранее спасибо.

Ответ №1:

Не могли бы вы попробовать следующее. Поскольку URL-адреса имеют свою уникальность, поэтому лучше проверять условие в их %{REQUEST_URI} значении, я проверяю, начинается ли REQUEST_URI с, user затем перейдите к 1 правилу, и если оно начинается с profile , то перейдите к другому, чтобы не было путаницы (где, я полагаю, вы очень хорошо старались, но поскольку нет разделения междуусловия, поэтому, следовательно, его запутанный движок ИМХО).

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/user/([w-] )/?$
RewriteRule ^.*$ /user.php?username=%1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/profile/([w-] )/?$
RewriteRule ^.*$ /profile.php?username=%1 [NC,L]
  

Ответ №2:

Вы также можете попробовать ниже, сначала проверив, не является ли входящий запрос ни файлом, ни каталогом, а затем проверить соответствие шаблону.

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^user/([w-] )/?$ /user.php?username=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^profile/([w-] )/?$ /profile.php?username=$1 [NC,L]