I am trying to match a single reference in a URL to pass to a script, while retaining the rest as the path to the script. For example:

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

However my backreference is matching multiple times. $2 only contains "bar.php" and $1 is somehow repeating for "parameter" and "foo".

How can I prevent the backreference from repeating itself?

Edit: I've narrowed down the problem somewhat by fiddling with the second part of the rewrite rule.

#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]

Which confuses me even more! Any help appreciated

1 Answer 1


Easy: add condition that will prevent execution of rewrite rule on already rewritten URL.

I see 2 main approaches (based on your URL examples):

1. Will prevent rewriting if URL was already rewritten by the same rule:

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

On initial rewrite iteration URL will be rewritten and query string will have project_slug= at the start of the string. On next iteration the condition will not allow rewriting because query string already starts with project_slug=.

Of course, this approach will not work if original URL (before rewriting) has query string that starts with project_slug= (e.g. /scripts/parameter/foo/bar.php?project_slug=hello) .. which should not happen under normal circumstances (unless someone knows how rewrite rule works and is messing around on purpose).

2. Allow rewrite execution ONLY on first iteration (regardless of which rule has rewritten this URL):

RewriteRule ^scripts/([^/]+)/(.*)$ scripts/$2?project_slug=$1 [L,QSA]

Unfortunately the variable used here %{ENV:REDIRECT_STATUS} is not populated on every Apache build/setup. Therefore it may work fine on your setup but may not on another hosting. Unfortunately I cannot tell you how to determine (configure your Apache) if it will work without executing some sort of rewrite test.

  • Thank you! I didn't realise rewrite rules could run more than once. Your first solution works perfectly
    – Tak
    Commented Aug 25, 2011 at 20:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.