Avatar of Brahmanatha
Brahmanatha
 asked on

Mod_Rewrite Condition to Redirect External Referrers

We inflate   EPUB's on our web site in advance, save them to e.g.

/public_html/media/books/#some-book-title#/web/ops/xhtml/some-page1.html

We then use LiveCode - RevIgniter to serve these inside an iFrame, inside our site wrapper.. this works great.

BUT  the  problem is Google is finding these pages, indexing and caching them and they are linked to and delivered outside our site wrapper. e.g.

http://dev.himalayanacademy.com/media/books/merging-with-siva/web/ops/xhtml/part_2ch_34a.html

I need to create a mod_rewrite condition that will redirect these to our CMS

in pseudo-code it would look like

IF
( RewriteCond $1 ^(media/books/[any string here, some reg ex I presume]/web/ops)  ) AND (referrer IS NOT localhost)
THEN
RewriteRule ^(.*)$ index.lc?/$1 [L]  
END IF

can you help me with the proper mod_rewrite rule for this?

Thanks!
Web ApplicationsWeb ComponentsApache Web Server

Avatar of undefined
Last Comment
Brahmanatha

8/22/2022 - Mon
Steve Bink

Your pseudo code is very similar to your actual need:
RewriteCond %{HTTP_REFERER} !^localhost$ [NC]
RewriteRule ^/?(media/books/(some regex)/web/ops) /index.lc/$1 [L,NC]

Open in new window


You'll need to be more explicit about (some regex), but that is the general form you want.
Brahmanatha

ASKER
Interesting... very simple really.  

"be more explicit about (some regex)" right...

The string ##-###-### that forms the URL segment between "books" and "web"

is a single string with no slashes (no additional segments)

/media/books/  ##-###-## /web/ops

where  #######is the title of a book. The strict convention on our site is: all lower case letters, words words delimited by dashes, underscore at the end followed by ISO 2 ltr language code where not English  e.g.

the-guru-chronicles
dancing-with-siva_es # in spanish

Some works in other languages have their titles in those languages, but the convention is that these strings ("file_id" in our mySql database) are always in the 0-127 range (ASCII) no unicode and no ANSI roman chars such as umlauts etc.  have trouble with figuring out how to make my reEx from being too "greedy") in needs to stop at the next slash in the URL string. How's this for an attempt?

RewriteRule ^/?(media/books/(.*?)/web/ops) /index.lc/$1 [L,NC]

or possibly more explicit?

RewriteRule ^/?(media/books/(.*\/)web/ops) /index.lc/$1 [L,NC]

Where the regex ends at the next slash?
ASKER CERTIFIED SOLUTION
Steve Bink

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
Brahmanatha

ASKER
the whole URL... our controller will need to see "/media" at beginning plus the matched title and the final segment, which is the page in the book to target. From there we will use another model/library script to display the page in our views.

Thanks for your help!
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
Brahmanatha

ASKER
Hmmm I had to extend this a bit:

RewriteCond %{HTTP_REFERER} !^localhost$ [NC]
RewriteRule ^/?(media\/books\/[-a-z_]+\/web\/ops\/xhtml\/.*) /index.lc/$1 [L,NC]


and now it works! at least our CMS gets the URL...
Brahmanatha

ASKER
Thanks Steve!