mod_rewrite again

In reference to http://oldlook.experts-exchange.com:8080/Web/Web_Servers/Apache/Q_21163692.html
The solution appeared correct, and did not give any errors, but now that I'm trying to implement it, it's not working.

The rule
RewriteRule ^topic/(.*)/(.*)$           topic.php?blog=$1&topic=$2              [L]
Is turning
/topic/arantius/tech/
into
topic.php?blog=arantius/tech/arantius&topic=tech/
where of course it should be
topic.php?blog=arantius&topic=tech

Which isn't quite cutting it! =)
LVL 18
arantiusAsked:
Who is Participating?
 
kalosiConnect With a Mentor Commented:
Well the behaviour is strange because the first rule should have the [R] redirect flag ... this should fix the problem.

if not you can change your rules in the following manner

RewriteEngine On
RewriteBase /
RewriteRule ^topic/(.+)/(.+[^/])/?$               topic.php?blog=$1&topic=$2              [L]
RewriteRule ^topic/(.+[^/])/?$                    /topic.php?blog=$1                      [L]
RewriteRule ^topic$                         topic.php                               [L]

I have a test binary and it produced the desired output in both cases:

-- with trailing slash
[oracle@rhel oracle]$ ./regmatcher '^topic/(.+)/(.+[^/])/?$' topic/one/two/ 3
Subexpression 0 index [0-14]: 'topic/one/two/'
Subexpression 1 index [6-9]: 'one'
Subexpression 2 index [10-13]: 'two'
[oracle@rhel oracle]$
-- without the trailing slash
[oracle@rhel oracle]$ ./regmatcher '^topic/(.+)/(.+[^/])/?$' topic/one/two 3
Subexpression 0 index [0-13]: 'topic/one/two'
Subexpression 1 index [6-9]: 'one'
Subexpression 2 index [10-13]: 'two'
[oracle@rhel oracle]$
0
 
kalosiCommented:
The rule should look like

RewriteRule ^/topic/(.*)/(.*)/$           topic.php?blog=$1&topic=$2              [L]

david
0
 
arantiusAuthor Commented:
The lack of non-greedy wildcard operators in 1.3 makes that rule not quite work in the big picture.  Below is a full set of rules that almost works in 1.3, the problem is the trailing slashes.  I want them to be optional, not required.  If I put the ? after the / that I used in 2, that matches the / inside the wildcard operator, breaking my site.

RewriteEngine On
RewriteBase /

RewriteRule ^news/archive/(.*)\.(.*)\.html$  news.php?do=archive&feedID=$1&start=$2  [L]
RewriteRule ^news/archive/(.*)\.html$        news.php?do=archive&feedID=$1           [L]
RewriteRule ^news/read/$                     news.php?do=read                        [L]
RewriteRule ^newarticle/(.*)/$               newarticle.php?blog=$1                  [L]
RewriteRule ^newarticle/$                    /                                       [L,R]
RewriteRule ^comment/(.*)/(.*)/$             comment.php?blog=$1&article=$2          [L]
RewriteRule ^comment/(.*)/$                  /blog/$1/                               [L,R]
RewriteRule ^comment/$                       /                                       [L,R]
RewriteRule ^article/(.*)/(.*)/$             article.php?blog=$1&article=$2          [L]
RewriteRule ^article/(.*)/$                  /blog/$1/                               [L,R]
RewriteRule ^article/$                       /                                       [L,R]
RewriteRule ^archive/(.*)/(.*)/$             /archive.php?blog=$1&start=$2           [L]
RewriteRule ^archive/(.*)/$                  /archive.php?blog=$1                    [L]
RewriteRule ^archive/$                       /                                       [L,R]
RewriteRule ^stumble/(.*)/(.*)/$             /stumble.php?blog=$1&start=$2           [L]
RewriteRule ^stumble/(.*)/$                  /stumble.php?blog=$1                    [L]
RewriteRule ^stumble/$                       /                                       [L,R]
RewriteRule ^games/game\.(.*)\.html$         /games/index.php?gameID=$1              [L]
RewriteRule ^games/game-(.+)/$               /games/index.php?gameID=$1              [L]
RewriteRule ^topic/(.+)/(.+)/$               topic.php?blog=$1&topic=$2              [L]
RewriteRule ^topic/(.+)/$                    /topic.php?blog=$1                      [L]
RewriteRule ^topic/$                         topic.php                               [L]
RewriteRule ^blog/(.+)/?$                    blog.php?blog=$1                        [L]
RewriteRule ^blog/?$                         /                                       [L,R]
0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
kalosiCommented:
Insert the foolowing rule in the beginning

RewriteRule ^(.*)/$ $1

this will remove the trailing slashes. Dont forget to remove the trailing slashes from the other rules.

david
0
 
arantiusAuthor Commented:
It doesn't quite remove the trailing slashes, it causes major problems.

With just the rules:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)/$ $1
RewriteRule ^topic/(.+)/(.+)$               topic.php?blog=$1&topic=$2              [L]
RewriteRule ^topic/(.+)$                    /topic.php?blog=$1                      [L]
RewriteRule ^topic$                         topic.php                               [L]

It sends /topic/arantius/ to /topic.php?blog=arantius&topic=arantius/
And /topic/arantius/general/ to /topic.php?blog=arantius/general/arantius&topic=general/

The log shows:

66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] add path-info postfix: /home/arantius/public_html/topic -> /home/arantius/public_html/topic/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic/arantius/general/ -> topic/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] applying pattern '^(.*)/$' to uri 'topic/arantius/general/'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (2) [per-dir /home/arantius/public_html/] rewrite topic/arantius/general/ -> topic/arantius/general
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] add per-dir prefix: topic/arantius/general -> /home/arantius/public_html/topic/arantius/general
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] add path-info postfix: /home/arantius/public_html/topic/arantius/general -> /home/arantius/public_html/topic/arantius/general/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic/arantius/general/arantius/general/ -> topic/arantius/general/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)/(.+)$' to uri 'topic/arantius/general/arantius/general/'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (2) [per-dir /home/arantius/public_html/] rewrite topic/arantius/general/arantius/general/ -> /topic.php?blog=arantius/general/arantius&topic=general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) split uri=/topic.php?blog=arantius/general/arantius&topic=general/ -> uri=/topic.php, args=blog=arantius/general/arantius&topic=general/
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (2) [per-dir /home/arantius/public_html/] trying to replace prefix /home/arantius/public_html/ with /
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (1) [per-dir /home/arantius/public_html/] internal redirect with /topic.php [INTERNAL REDIRECT]
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^(.*)/$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)/(.+)$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:34:12 -0400] [www.arantius.com/sid#81d4744][rid#8121174/initial/redir#1] (1) [per-dir /home/arantius/public_html/] pass through /home/arantius/public_html/topic.php


Without the rule you suggested, the log is:

66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] add path-info postfix: /home/arantius/public_html/topic -> /home/arantius/public_html/topic/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic/arantius/general/ -> topic/arantius/general/
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)/(.+)$' to uri 'topic/arantius/general/'
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (2) [per-dir /home/arantius/public_html/] rewrite topic/arantius/general/ -> /topic.php?blog=arantius&topic=general/
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (3) split uri=/topic.php?blog=arantius&topic=general/ -> uri=/topic.php, args=blog=arantius&topic=general/
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (2) [per-dir /home/arantius/public_html/] trying to replace prefix /home/arantius/public_html/ with /
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#812ffe4/initial] (1) [per-dir /home/arantius/public_html/] internal redirect with /topic.php [INTERNAL REDIRECT]
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)/(.+)$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic/(.+)$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] strip per-dir prefix: /home/arantius/public_html/topic.php -> topic.php
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (3) [per-dir /home/arantius/public_html/] applying pattern '^topic$' to uri 'topic.php'
66.199.132.173 - - [13/Oct/2004:13:36:00 -0400] [www.arantius.com/sid#81d4744][rid#8120e14/initial/redir#1] (1) [per-dir /home/arantius/public_html/] pass through /home/arantius/public_html/topic.php
0
 
arantiusAuthor Commented:
Ah yes, the pseudo-non-greedy character class inversion .. might well work.  I'll get back to you.
0
 
arantiusAuthor Commented:
Everything finally works right, thank you!  For interested parties, the final set of rules ended up being:

ErrorDocument 404 /404

RewriteEngine On
RewriteBase /
RewriteRule ^news/archive/(.*)\.(.*)\.html$  /news.php?do=archive&feedID=$1&start=$2 [L]
RewriteRule ^news/archive/(.*)\.html$        /news.php?do=archive&feedID=$1          [L]
RewriteRule ^news/read/?$                    /news.php?do=read                       [L]
RewriteRule ^news/?$                         /news.php                               [L]
RewriteRule ^newarticle/(.*[^/])/?$          /newarticle.php?blog=$1                 [L]
RewriteRule ^comment/(.*[^/])/(.*[^/])/?$    /comment.php?blog=$1&article=$2         [L]
RewriteRule ^article/(.*[^/])/(.*[^/])/?$    /article.php?blog=$1&article=$2         [L]
RewriteRule ^archive/(.*[^/])/(.*[^/])/?$    /archive.php?blog=$1&start=$2           [L]
RewriteRule ^archive/(.*[^/])/?$             /archive.php?blog=$1                    [L]
RewriteRule ^stumble/(.*[^/])/(.*[^/])/?$    /stumble.php?blog=$1&start=$2           [L]
RewriteRule ^stumble/(.*[^/])/?$             /stumble.php?blog=$1                    [L]
RewriteRule ^games/game\.(.*)\.html$         /games/index.php?gameID=$1              [L]
RewriteRule ^games/game-(.*[^/])/?$          /games/index.php?gameID=$1              [L]
RewriteRule ^topic/(.*[^/])/(.*[^/])/?$      /topic.php?blog=$1&topic=$2             [L]
RewriteRule ^topic/(.*[^/])/?$               /topic.php?blog=$1                      [L]
RewriteRule ^topic/?$                        /topic.php                              [L]
RewriteRule ^blog/(.*[^/])/?$                /blog.php?blog=$1                       [L]
RewriteRule ^404$                            /                                       [L,R]

(And yeah, all this stuff would line up in a monospace font.)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.