I can’t figure this out as when I test my rules at:
http://htaccess.madewithlove.be/
It states it should be working.
I am using this url:
http://site.com/uk/en/clients/1/view
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteRule ^(.+[^/](?!\.php))$ $1/ [QSA,PT]
#language
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !lang
RewriteRule ^([a-z]{2})/([a-z]{2})(?:/(.*)|)$ /$1/$3?lang=$2 [NC,QSA,PT]
#country
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !country
RewriteRule ^([a-z]{2})(?:/(.*)|)$ /$2?country=$1 [NC,QSA,PT]
#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1&test=$2 [NC,QSA,PT]
#without actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT]
#id
RewriteCond %{QUERY_STRING} !id
RewriteRule ^([^/]+)/(.*)$ /$2?id=$1&test2=$2 [NC,QSA,PT]
#actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteCond %{QUERY_STRING} !action
RewriteRule ^/(.*)$ /?action=$1 [NC,QSA,PT]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /$ /index.php [NC,QSA,L]
At the moment however it terminates at id and this is what is output:
Array ( [id] => view [test2] => [keyword] => clients [test] => 1/view [country] => uk [lang] => en )
I can’t make out why it would be ignoring the 1/ and setting id as view instead?
Keeping in mind that The [PT] flag passes the URI back through the entire URL mapping mechanism including mod_alias and back through all the rules of the rewrite engine (again and again), based on the output array that you’re seeing, it looks like this rule may be what needs tweaking:
^([^/]+)/(.*)/$is matching against “clients/1/view/” and the 2nd backreference becomes “1/view“, thus the test param gets assigned to 1/view and the URI becomes/1/view.The 2nd time around the URI that is matched is
1/view, so the result of this rule is/view/?keyword=1&test=view&keyword=clients&test=1/view&country=uk&lang=en(because of the QSA).So “test” and “keyword” get matched twice, because there is no condition to prevent this. So once more around all the rewrite rules, we finally get to the id part, by then, the URI is
view/, which matches^([^/]+)/(.*)$and the first backreference match ($1) is “view” and the second ($2) is blank because(.*)matches nothing. Thus id=view.I’m not sure what these parameter values are actually supposed to end up as, but maybe a check with a RewriteCond against the “test” or “keyword” query string param in the above rule would prevent that rule from being applied twice? Like: