.htaccess Удалить первый параметр URL PHP, если существует второй

.htaccess Удалить первый параметр URL PHP, если существует второй

Вот мой код .htaccess:

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

*где $1 = профиль и $3 = john-smith

Это работает отлично, переписывая какhttps://example.com/profile/john-smithно мне нужно второе правило переписывания, напримерhttps://example.com/john-smithтолько если существует второй параметр, содержащий john-smith.

Спасибо!

ОБНОВЛЕНИЕ: (Полные правила моего файла .htaccess)

# protect files beginning with .
RewriteRule /\.(.*) - [NC,F]

# redirect HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

# No root access without index.* and other security
RewriteEngine On
Options All -Indexes
RewriteBase /
DirectoryIndex index.php index.html index.htm
ErrorDocument 404 https://example.com/pages.php?PAGE=404

# Prevent upload malicious PHP files
<FilesMatch “\.(php|php\.)$”> 
Order Allow,Deny 
Deny from all 
</FilesMatch>

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [QSA, L]

решение1

RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

"Проблема" в том, что это также будет соответствовать запросу для /john-smith(2-я группа необязательна), но переписывает запрос на pages.php?PAGE=john-smith&LINK=, вместо pages.php?LINK=john-smithтого, чтобы как требуется. Для этого вам понадобится отдельное правило. Это также соответствует /profile/john-smith/anything, отбрасывая, /anythingно все равно переписывая запрос (отношение многие к одному), что потенциально открывает ваш сайт для спамеров.

Если предположить, что вы не допускаете точек ( .) в сегментах пути URL (как в ваших примерах), то нет необходимости проверять, что запрос не сопоставляется с файлом. Например, запрос на /profile/john-smithникогда не сможет сопоставиться с файлом, если все ваши файлы имеют расширения, поэтому проверка файловой системы излишня.

Вместо этого попробуйте следующее:

# Rewrite exactly one path segment
# eg. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]

# Rewrite exactly two path segments
# eg. /profile/john-smith to pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]

Флаг NCв предыдущей RewriteCondдирективе, вероятно, излишен.

([^/.]+)- Я изменил подшаблон захвата, чтобы также исключить точки. И второе правило соответствует ровно двум сегментам пути, а не одномуилидва сегмента пути, как в вашем примере.

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