phillystyle123
asked on
htaccess rewrite rule - optional trailing slash
Hello,
I'm using this rewrite rule:
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal ink=$1 [QSA]
So I have the option to go with or without a trailing slash in my URL - for example both of these URLs work AND pull the content from the database
http://ikonltd.com/artists/abakanowicz
AND
http://ikonltd.com/artists/abakanowicz/
My issue is when I click on either of the thumbs on the above URL, the content does not get pulled from the database on the next page:
http://ikonltd.com/artists/abakanowicz/1276/1/
If I don't allow the no trailing slash option:
RewriteRule ^/artists/(.+?)/ /artists/artist.cfm?permal ink=$1 [QSA]
everything works fine. the client, however, wants the option of going with or without the trailing slash after the artist last name (permalink).
Here's both rewrite rules - again both work if the first one is
RewriteRule ^/artists/(.+?)/ /artists/artist.cfm?permal ink=$1 [QSA]
INSTEAD OF
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal ink=$1 [QSA]
CURRENT REWRITE RULES:
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal ink=$1 [QSA]
RewriteRule ^/artists/(.+?)/(.+?)/(.+? )/ /artists/artwork_detail.cf m?permalin k=$1&AutoA rtID=$2&Pa geNum_newa qimages=$3 [QSA]
I'm using this rewrite rule:
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal
So I have the option to go with or without a trailing slash in my URL - for example both of these URLs work AND pull the content from the database
http://ikonltd.com/artists/abakanowicz
AND
http://ikonltd.com/artists/abakanowicz/
My issue is when I click on either of the thumbs on the above URL, the content does not get pulled from the database on the next page:
http://ikonltd.com/artists/abakanowicz/1276/1/
If I don't allow the no trailing slash option:
RewriteRule ^/artists/(.+?)/ /artists/artist.cfm?permal
everything works fine. the client, however, wants the option of going with or without the trailing slash after the artist last name (permalink).
Here's both rewrite rules - again both work if the first one is
RewriteRule ^/artists/(.+?)/ /artists/artist.cfm?permal
INSTEAD OF
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal
CURRENT REWRITE RULES:
RewriteRule ^/artists/(.+?)/?$ /artists/artist.cfm?permal
RewriteRule ^/artists/(.+?)/(.+?)/(.+?
The client is asking you to make two different things mean the same. A trailing slash means that the server should look for a directory. The absences of a trailing slash means that the server should look for a script. It's been this way since about 1989 and while I normally agree that the client is always right, this request just does not make sense.
The way it the first rewrite rule was written, any URL that starts with /artists/ will be matched, so it is unfortunately also matching the content URL, which is http://ikonltd.com/artists/abakanowicz/1243/2/
Try this version instead, which should only match if there is a single subfolder after /artists/:
:
Try this version instead, which should only match if there is a single subfolder after /artists/:
:
RewriteRule ^/artists/([^\/]*)/?$ /artists/artist.cfm?permalink=$1 [QSA]
ASKER
sjklein42 - this works great
RewriteRule ^/artists/([^\/]*)/?$ /artists/artist.cfm?permal ink=$1 [QSA]
the only issue i'm having is now the database content is not being outputed on this page:
http://ikonltd.com/artists/index.cfm
RewriteRule ^/artists/([^\/]*)/?$ /artists/artist.cfm?permal
the only issue i'm having is now the database content is not being outputed on this page:
http://ikonltd.com/artists/index.cfm
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
perfecto - thanks so much!
if you have a minute - could you break down the logic for the rewrite rule so i know what means what?
RewriteRule ^/artists/([^\/\.]+)/?$ /artists/artist.cfm?permal ink=$1 [QSA]
if you have a minute - could you break down the logic for the rewrite rule so i know what means what?
RewriteRule ^/artists/([^\/\.]+)/?$ /artists/artist.cfm?permal
Breaking down this pattern:
^/artists/([^\/\.]+)/?$
The ^ means match start-of-string.
Then match exactly /artists/
Then the parenthesized part (...) will go into the $1 variable to be used in the substition.
Within the parens, we have:
[^\/\.]+
the [^\/\.] means match anything EXCEPT (that's what the ^ does) a slash or a dot. By habit I use the \ to "quote" the special characters / and . even though in this case the / probably does not need the \ before it
the + means match one or more of them
so together it matches everything up to the next dot or slash, whichever comes first and puts that string into $1.
Then back to the /? which matches an optional slash (or not)
Followed by $ which means match end-of-string. So if there is anything unmatched left over at this point, the pattern fails (which is what we want it to do).
On the right side we use the $1 variable to plug the artist name we picked up with ([^\/\.]+) into the rewritten URL
^/artists/([^\/\.]+)/?$
The ^ means match start-of-string.
Then match exactly /artists/
Then the parenthesized part (...) will go into the $1 variable to be used in the substition.
Within the parens, we have:
[^\/\.]+
the [^\/\.] means match anything EXCEPT (that's what the ^ does) a slash or a dot. By habit I use the \ to "quote" the special characters / and . even though in this case the / probably does not need the \ before it
the + means match one or more of them
so together it matches everything up to the next dot or slash, whichever comes first and puts that string into $1.
Then back to the /? which matches an optional slash (or not)
Followed by $ which means match end-of-string. So if there is anything unmatched left over at this point, the pattern fails (which is what we want it to do).
On the right side we use the $1 variable to plug the artist name we picked up with ([^\/\.]+) into the rewritten URL
ASKER
thanks tons for the explanation!