I am working on a Drupal project. There is a folder "archive" in my root directory.

When people visit my site, for example, www.example.com/abc.foo, if this URL does not exist, instead of a 404 page not found error, I want visitors automatically go to www.example.com/archive/abc.foo. If it still does not exist, then a 404 error.

Some features I'd like to see are:

1) the redirect to /archive/abc.foo is transparent to visitors, they will even not see /archive/abc.foo; instead, the url is still www.example.com/abc.foo

2) abc.foo is a file here. However, it is not limited to file, can also be directory. For example, www.example.com/directory, www.example.com/directory/subdirectory/file.foo, www.example.com/directory/subdirectory, etc.

3) Rewrite only applies to root directory. No rewrite in "archive" folder

4) No infinite rewrite (i.e.: /abc.html not exist, go to /archive/abc.html, if /archive/abc.html does not exist either, will NOT go to /archive/archive/abc.html)

Here is my .htaccess

# Apache/PHP/Drupal settings:
#

# Protect files and directories from prying eyes.
<FilesMatch "\.(engine¦inc¦info¦install¦module¦profile¦po¦sh¦.*sql¦theme¦tpl(\.php)?¦xtmpl)$¦^(code-style\.pl¦Entries.*¦Repository¦Root¦Tag¦Template)$">
Order allow,deny
</FilesMatch>

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# Follow symbolic links in this directory.
Options All

# Customized error messages.
ErrorDocument 404 /index.php

# Set the default handler.
DirectoryIndex index.php index.html index.htm

# Override PHP settings. More in sites/default/settings.php
# but the following cannot be changed at runtime.



# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
php_value magic_quotes_gpc 0
php_value register_globals 0
php_value session.auto_start 0
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_value mbstring.encoding_translation 0
</IfModule>

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
# Enable expirations.
ExpiresActive On
# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600
# Do not cache dynamically generated pages.
ExpiresByType text/html A1
</IfModule>

# Various rewrite rules.
<IfModule mod_rewrite.c>
RewriteEngine on

# If your site can be accessed both with and without the 'www.' prefix, you
# can use one of the following settings to redirect users to your preferred
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
#
# To redirect all users to access the site WITH the 'www.' prefix,
# (http://example.com/... will be redirected to http://www.example.com/...)
# adapt and uncomment the following:
# RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
# RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
#
# To redirect all users to access the site WITHOUT the 'www.' prefix,
# (http://www.example.com/... will be redirected to http://example.com/...)
# uncomment and adapt the following:
# RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
# RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

# Modify the RewriteBase if you are using Drupal in a subdirectory or in a
# VirtualDocumentRoot and the rewrite rules are not working properly.
# For example if your site is at http://example.com/drupal uncomment and
# modify the following line:
# RewriteBase /drupal
#
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /


# Rewrite current-style URLs of the form 'index.php?q=x'.


RewriteCond %{DOCUMENT_ROOT}/$1 !-f
RewriteCond %{DOCUMENT_ROOT}/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d
RewriteRule ^(.*) /archive/$1


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule> 

The problem is that :

If I visit /abc.php, and abc.php is physically located in /archive (NO /abc.php, it is just a URL generated by Drupal's URL path feature), then it reports 404 error.

It is the same if I visit /directory and there is a physical /archive/directory folder.

If I visit /abc or /abc.php, and there is no /achive/abc or /archive/abc.php , then it works.

Here is the demo site:

http://fisheries.etsscore.com

For example:

Visiting http://fisheries.etsscore.com/mission.php gives 404 (as http://fisheries.etsscore.com/archive/mission.php exists)
But http://fisheries.etsscore.com/links.php is okay

Visiting http://fisheries.etsscore.com/members gives 404 (as http://fisheries.etsscore.com/archive/members exists)
But http://fisheries.etsscore.com/projects is okay

If I change the Rewrite rule order so that it is

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1

RewriteCond %{DOCUMENT_ROOT}/$1 !-f
RewriteCond %{DOCUMENT_ROOT}/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d
RewriteRule ^(.*) /archive/$1 [L,QSA]

Then the problem is that http://fisheries.etsscore.com/members/ or URLs like it works; However, visit to http://fisheries.etsscore.com/aborig_new/ gives 404 error, while it is supposed to be redirect to http://fisheries.etsscore.com/archive/aborig_new/

How can I fix this?

Many thanks,

Comments

bigheadfish’s picture

Thanks,

avangelist’s picture

Did you ever have any joy with this?

I am attempting the same thing

have an archive site which is static html pages

have set archive.domain as sub-domain.

Want to use htaccess to redirect http://www.mydomain.com/archive/ to http://archive.mydomain.com/archive/

easy as that! if I use standard redirect 301 in before the drupal RewriteCond lines I get infinate loop as it tries to pass a drupal ?q= string.

Web Developer
Music Photographer