Объединить RewriteRules в .htaccess, чтобы определенный параметр запроса игнорировался

#apache #.htaccess #mod-rewrite #url-rewriting #query-string

#apache #.htaccess #mod-перезаписать #url-перезапись #строка запроса

Вопрос:

Я пытаюсь написать некоторые RewriteRules, чтобы, когда запрос содержал определенный параметр запроса, назовем его foo , он полностью игнорировался (удалялся). Причина этого в том, что мне нужно использовать foo внутренне в другом RewriteRule, чтобы я мог передавать информацию на мой передний контроллер. Если foo бы он уже существовал, приложение не работало бы должным образом. Я пробовал несколько решений, например, это, но это не дает того, чего я хотел бы достичь. До сих пор я пробовал следующее:

 <IfModule mod_rewrite.c>
RewriteEngine On

# Remove possible existing query parameter called 'foo'
RewriteCond %{QUERY_STRING} ^(.*)amp;?foo=[^amp;] amp;?(.*)$ [NC]
RewriteRule ^(.*)$ /$1?%1%2 [R=301,L]

# Lead every page/API request to index.php
RewriteCond $1 !.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.php?foo=$1 [L,QSA]

</IfModule>
 

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

Есть ли способ просто удалить foo параметр, не затрагивая другой RewriteRule (или просто переопределить его во второй части)? Заранее спасибо!

Редактировать

Просто чтобы прояснить несколько вещей: в моем приложении фронт-контроллер представляет собой PHP-скрипт, который принимает перезаписанный параметр GET foo , который содержит первоначально запрошенный URL. Однако, если пользователь добавляет foo к запросу, я должен убедиться, что это не тот foo параметр, который передается на передний контроллер, поскольку тогда приложение не будет работать должным образом.

Например: если клиент запрашивает https://example.com/something?foo=123amp;bar=456 , запрос должен быть перенаправлен на https://example.com/something?bar=456 (или, альтернативно, вообще не перенаправляться), а параметр запроса foo в строке 9, который предназначен только для моего фронт-контроллера, должен быть https://example.com/something с bar не изменяемым. К сожалению, приведенный выше код этого не сделает. Вместо этого я перенаправлен на https://example.com/index.php?bar=456 . Я думаю, решение на самом деле довольно простое, но я не могу понять, как это сделать.

Комментарии:

1. Действительно здорово, что вы поделились своими усилиями и файлом htaccess в своем вопросе, продолжайте в том же духе. Не могли бы вы также поделиться, с какого URL-адреса (только образцы) на какой URL-адрес (серверную часть) вы хотите обслуживать для большей ясности вашего вопроса, спасибо.

2. На самом деле это просто о том, как «зарезервировать» определенный параметр запроса для внутреннего использования. Я вскоре поясню это в своем вопросе.

Ответ №1:

Не могли бы вы попробовать следующее. пожалуйста, убедитесь, что вы очистили кэш браузера перед тестированием URL-адресов. Учитывая, что здесь вам нужно, чтобы все после amp; в строке запроса передавалось в переписанном URL здесь. Добавлено 2 существующих правила из файла htaccess OP и изменено место для правила https, переместив его на самое первое место.

 RewriteEngine ON
##From OP's comments adding these here, http --> https should come first.
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

# Remove possible existing query parameter called 'foo'
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(.*)amp;?foo=[^amp;] amp;?(.*)$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}?%1%2 [NE,L]

# Lead every page/API request to index.php
RewriteCond $1 !.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.php?foo=$1 [L,QSA]
 

Комментарии:

1. Мой браузер говорит Error: Request could not be executed . Изначально это было на немецком, я надеюсь, что этот перевод имеет смысл.

2. @Boostinger, хорошо, продолжайте делать это в https качестве самых первых правил, разместите их над этими 2 правилами. Также необходимо проверить ваше 2-е правило, как http://localhost:80/page/API?b;blablabla в нем есть url? Если да, то мы можем также включить это условие в ваше текущее правило API, дайте мне знать об этом же один раз.

3. Да, последнее обновление, похоже, работает! Единственный случай, когда он все еще ведет себя по-другому, — это root . Если я запрашиваю https://example.com/?foo=123amp;bar=456 содержимое $_GET в моем PHP-скрипте Array ( [foo] => foo=123 [bar] => 456 ) .

4. Я проверю это. Я думаю, что это уже работало до этого последнего изменения, как кажется. Мои извинения, возможно, я ввел что-то не так во время проверки. Спасибо за вашу помощь!

5. нет проблем. Если есть лучшее / более чистое решение, просто добавьте его, когда у вас будет время. Теперь это работает для меня, так что я доволен. Но мне все еще интересно, как это сделать правильно, конечно, и я проверю это, если есть что-то новое.