2016-11-08 1 views
0

У меня есть Rewrite Rule, какPHP - URL с несколькими параметрами и тем же именем вызывает неожиданное поведение

RewriteRule settings/([a-zA-Z0-9_]+)/?$ settings/?path=$1 [NC,L,QSA] 

Это в основном принимает параметр пути и переписать URL, как этот http://localhost/settings/?path=abc =>http://localhost/settings/abc

Но есть проблема! когда я обеспечиваю что-то вроде http://localhost/settings/abc/?path=xyz параметра пути переписывается с А, и это открывает http://localhost/settings/abc/ с данными xyz

После дальнейшего копания я заметил, что проблема вызвана параметрами в самом URL. По умолчанию он собирает значение последнего параметра с тем же именем http://localhost/settings/account/?path=profile&path=account&path=profile

поэтому значение, которое я могу получить в этом случае для $_REQUEST['path'], равно profile. Как я могу просто выбрать первое значение из тех же параметров и игнорировать остальные?

Единственное, что я могу сделать, это удалить [QSA] из RewriteRule, что сделает исправление, но мне нужны другие параметры, переданные в url.

Как я могу это достичь?

+0

Просто используйте большой! случайная строка в переписывании также сохраняет изменение переопределения малого. – JOUM

+0

@JOUM Я действительно не понял, что вы пытались передать –

+0

'Но проблема! ... 'можно зафиксировать с помощью этого (только для внутреннего использования, возможность переопределить это значение немного vurnebule для вашего приложения).Но часть «После дальнейшего копания» является дополнительной проблемой на вашей стороне, потому что вам следует помешать url, как это на первом месте (повторное использование одинаковых имен для аргументов). – JOUM

ответ

2

PHP распознает скобки [], присоединенные к параметру, например.

http://localhost/settings/account/?path[]=profile&path[]=account&path[]=profile 

будет переведен в массив

$path = $_GET['path']; 
print_r($path); 

показывает

Array ([0] => профиль [1] => учетная запись [2] => профиль)

Таким образом, вы можете получить доступ к любому из «путей», которые вам нравятся.


я мог себе представить некоторые RewriteCond операцию, чтобы удалить часть строки запроса

RewriteCond %{QUERY_STRING} ^(.*)&path=.*?&(.*)$ 
RewriteRule^%{REQUEST_URI}?%1&%2 

RewriteCond %{QUERY_STRING} ^path=.*?&(.*)$ 
RewriteRule^%{REQUEST_URI}?%1 

RewriteCond %{QUERY_STRING} ^(.*)&path=.*$ 
RewriteRule^%{REQUEST_URI}?%1 

В зависимости от того, где path есть, это будет удалить его из строки запроса. И, наконец, последнее правило будет добавить новый путь снова

RewriteRule settings/([a-zA-Z0-9_]+)/?$ settings/?path=$1 [NC,L,QSA] 

Хотя, я не знаю, если это работает на всех, и как (в) эффективное это.

Существует одна оговорка, вы должны проверить на REDIRECT_STATUS, чтобы предотвратить бесконечный цикл.

+0

Спасибо за ответ. Это выполнит эту работу, но мой вопрос заключается в том, что мы не можем просто ограничить значение первым параметром, если есть несколько параметров с одинаковым именем? Мне просто нужно одно и первое значение, а вместо этого просто переписывание и выбор последнего значения. –

1

Вы можете использовать эти 2 правила в вашем .htaccess:

# remove path= parameter from query string, if it exists 
RewriteCond %{THE_REQUEST} \?(.*&)?path=[^&]*(?:&(.*))?$ [NC] 
RewriteRule ^settings/. %{REQUEST_URI}?%1%2 [L,R=301,NE,NC] 

# your existing rule 
RewriteCond %{THE_REQUEST} \?(.*&)?path=[^&]*(?:&(\S*))? [NC] 
RewriteRule ^settings/ %{REQUEST_URI}?%1%2 [L,R=302,NE,NC] 

RewriteCond %{QUERY_STRING} !(?:^|&)path= [NC] 
RewriteRule ^(settings)/(\w*)/?$ $1/?path=$2 [NC,L,QSA] 
+0

Отлично работает, если я использую URL перезаписи 'http: // localhost/settings/abc? Path = xyz & ref = menu', но с этим условием не выполняется' http: // localhost/settings /? Path = abc & ref = menu' –

+0

И если Я использую что-то вроде этого: http: // localhost/settings /? Path = abc & ref = menu' перенаправляет на 'http: // localhost/settings /? Ref = menu% 20HTTP/1.1' –

+0

А я ошибся в первом править. Попробуйте мои обновленные правила. – anubhava

 Смежные вопросы

  • Нет связанных вопросов^_^