Solved

mod_rewrite again

Posted on 2004-10-12
7
292 Views
Last Modified: 2012-05-05
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! =)
0
Comment
Question by:arantius
  • 4
  • 3
7 Comments
 
LVL 4

Expert Comment

by:kalosi
ID: 12295266
The rule should look like

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

david
0
 
LVL 18

Author Comment

by:arantius
ID: 12298157
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
 
LVL 4

Expert Comment

by:kalosi
ID: 12298200
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
Easy, flexible multimedia distribution & control

Coming soon!  Ideal for large-scale A/V applications, ATEN's VM3200 Modular Matrix Switch is an all-in-one solution that simplifies video wall integration. Easily customize display layouts to see what you want, how you want it in 4k.

 
LVL 18

Author Comment

by:arantius
ID: 12300485
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
 
LVL 4

Accepted Solution

by:
kalosi earned 250 total points
ID: 12305937
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
 
LVL 18

Author Comment

by:arantius
ID: 12308008
Ah yes, the pseudo-non-greedy character class inversion .. might well work.  I'll get back to you.
0
 
LVL 18

Author Comment

by:arantius
ID: 12308256
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

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

As Wikipedia explains 'robots.txt' as -- the robot exclusion standard, also known as the Robots Exclusion Protocol or robots.txt protocol, is a convention to prevent cooperating web spiders and other web robots from accessing all or part of a websit…
If you are running a LAMP infrastructure, this little code snippet is very helpful if you are serving lots of HTML, JavaScript and CSS-related information. The mod_deflate module, which is part of the Apache 2.2 application, provides the DEFLATE…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question