Рейтинг:1

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

флаг cn

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

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

*где 1 доллар = профиль и 3 доллара = Джон-Смит

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

Спасибо!

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

# защитить файлы, начинающиеся с .
Правило перезаписи /\.(.*) - [NC,F]

# перенаправить HTTPS
RewriteCond %{SERVER_PORT} 80
Правило перезаписи ^(.*)$ https://www.example.com/$1 [R,L]

# Нет root-доступа без index.* и других мер безопасности
RewriteEngine включен
Опции Все -Индексы
Переписать Базу /
DirectoryIndex index.php index.html index.htm
Документ об ошибке 404 https://example.com/pages.php?PAGE=404

# Предотвратить загрузку вредоносных файлов PHP
<FilesMatch â\.(php|php\.)$â> 
Заказать Разрешить, Запретить 
Запретить от всех 
</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
Правило перезаписи ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [QSA, L]
флаг kz
Не могли бы вы объяснить на естественном языке, что именно вы пытаетесь сделать. т.е. Запрашиваемые URL-адреса и ожидаемые целевые URL-адреса? В двух приведенных вами примерах URL-адресов нет «параметров URL» («параметры URL» присутствуют только в переписываемом URL-адресе). «Мне нужно второе правило перезаписи, такое как `https://example.com/john-smith`, только если существует второй параметр, содержащий john-smith» - в этом URL-адресе нет «второго параметра», есть только один _path сегмент_ `Джон-Смит`?
Adrian avatar
флаг cn
Первоначальная структура URL перед кодом htaccess выглядит так: https://example.com/pages.php?PAGE=profile&LINK=john-smith. Единственное, что мне нужно сделать прямо сейчас, это удалить первый параметр (PAGE=profile), когда существует второй, потому что у меня бывают ситуации, когда существует только первый параметр.
флаг kz
Таким образом, когда приходит запрос для `example.com/john-smith` (т.е. только один сегмент пути и без косой черты в конце), он должен переписать запрос на `/pages.php?LINK=john-smith`?
Adrian avatar
флаг cn
Да, точно...
Рейтинг:0
флаг kz
Правило перезаписи ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

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

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

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

# Переписать ровно один сегмент пути
# например. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/.]+)$ pages.php?LINK=$1 [L]

# Переписать ровно два сегмента пути
# например. /profile/john-smith на pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]

Северная Каролина флаг на предыдущем RewriteCond директива, вероятно, избыточна.

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

Adrian avatar
флаг cn
Большое спасибо за ваш ответ! К сожалению, ваше решение не работает в моей ситуации... Код «сегмента из двух частей» работает, только если я меняю $ на ? и без точки. «Одночастный сегмент» вообще не работает.
флаг kz
@ Адриан Что ты имеешь в виду под «не работает»? Что именно происходит? Вы получаете ошибку? Какой ответ вы видите? Если «сегмент из двух частей» работает только в том случае, если вы его измените, то он соответствует чему-то другому, чем приведенные в качестве примера URL-адреса, как указано. Какие еще директивы есть в этом файле `.htaccess`? Пожалуйста, отредактируйте свой вопрос, чтобы включить полный файл `.htaccess` с этими директивами - у вас может возникнуть конфликт. И где находится этот файл `.htaccess`? У вас есть другие файлы `.htaccess`?
Adrian avatar
флаг cn
Я только что обновил свой вопрос, указав полные правила моего файла .htaccess. Итак, файл htaccess находится в той же папке, что и pages.php, и он у меня единственный. Это не является конкретной ошибкой для правил «сегмента одной части». На самом деле, результат выглядит как потерянная страница с некоторыми фрагментами моего верхнего и нижнего колонтитула, не отображающими правильный контент, поскольку он загружается, когда я получаю доступ без переписанного URL-адреса.

Ответить или комментировать

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