Solved

mod_rewrite again

Posted on 2004-10-12
7
289 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
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.

 
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

Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

Question has a verified solution.

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

Hi, in this article I'm going to teach you how to run your own site, and how to let people in (without IP). I'll talk about and explain each step... :) By the way, everything in this Tutorial is completely free and legal. This article is for …
If you've heard about htaccess and it sounds like it does what you want, but you're not sure how it works... well, you're in the right place. Read on. Some Basics #1. It's a file and its filename is .htaccess (yes, with a dot in the front). #…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

770 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