Опитвам се да съвпадна с една препратка в URL, за да предам на скрипт, като запазвам останалото като пътя към скрипта. Например:

#/scripts/paramater/foo/bar.php should call #/scripts/foo/bar.php?id=parameter RewriteRule ^scripts/([^/]+)/(.*)$ scripts/$2?id=$1 [L,QSA] 

Моята обратна връзка обаче съвпада няколко пъти. $ 2 съдържа само "bar.php" и $ 1 по някакъв начин се повтаря за "параметър" и "foo".

Как мога да предотвратя повторението на обратната препратка?

Редактиране: Донякъде стесних проблема, като се забърках с втората част на правилото за пренаписване.

#This doesn't work, as above #Outputs: scripts/bar.php?id=foo?id=parameter RewriteRule ^scripts/([^/]+)/(.*)$ scripts/$2?id=$1 [L,QSA] #This works #Outputs: foo/bar.php?id=parameter RewriteRule ^scripts/([^/]+)/(.*)$ $2?project_slug=$1 [L,QSA] 

Което ме обърква още повече! Всяка помощ оценявам

Лесно: добавете условие, което ще предотврати изпълнението на правилото за пренаписване на вече пренаписан URL адрес.

Виждам 2 основни подхода (въз основа на вашите примери за URL адреси):

1. Ще предотврати пренаписването, ако URL адресът вече е пренаписан от същото правило:

RewriteCond %{QUERY_STRING} !^project_slug= RewriteRule ^scripts/([^/]+)/(.*)$ scripts/$2?project_slug=$1 [L,QSA] 

При първоначално пренаписване на итерация URL адресът ще бъде пренаписан и ще има низ за заявка project_slug= в началото на низа. При следваща итерация условието няма да позволи пренаписване, защото низът на заявката вече започва с project_slug=.

Разбира се, този подход няма да работи, ако оригиналният URL (преди пренаписване) има низ за заявка, който започва с project_slug= (напр. /scripts/parameter/foo/bar.php?project_slug=hello) .. което не бива да се случва при нормални обстоятелства (освен ако някой не знае как работи правилото за пренаписване и се забърква нарочно).

2. Разрешаване на презаписване на изпълнение САМО при първата итерация (независимо от това кое правило е пренаписало този URL):

RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^scripts/([^/]+)/(.*)$ scripts/$2?project_slug=$1 [L,QSA] 

За съжаление използваната тук променлива %{ENV:REDIRECT_STATUS} не се попълва при всяка Apache компилация / настройка. Следователно може да работи добре за вашата настройка, но не и за друг хостинг. За съжаление не мога да ви кажа как да определите (конфигурирате вашия Apache) дали ще работи, без да изпълните някакъв тест за пренаписване.

  • Благодаря ти! Не осъзнавах, че правилата за пренаписване могат да се изпълняват повече от веднъж. Първото ви решение работи перфектно

е работил за вас: Charles Robertson | Искате ли да се свържете с нас?

Полезна информация