Вот мой код .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
директиве, вероятно, излишен.
([^/.]+)
- Я изменил подшаблон захвата, чтобы также исключить точки. И второе правило соответствует ровно двум сегментам пути, а не одномуилидва сегмента пути, как в вашем примере.