Redirect - conficting rules

Hello!

I moved my opencart script from subfolder store/ to site root. In index of search engines there are links which point to old locations, for example:

mysite.tld/store/page24?limit=25
mysite.tld/store/page503

Some of those pages with parameters, some are not. I need them to be redirected like this:
mysite.tld/store/page24?limit=25 >>> mysite.tld/page24?limit=25
mysite.tld/store/page503 >>> mysite.tld/page503

I’m setting up .htaccess rules and to the moment ended with following directive:

RedirectMatch 301 ^/store/(.*)$ http://mysite.tld/$1

But it doesn’t work because of this directive:

RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

…or in such variant:

RewriteRule ^(.*) index.php?_route_=$1 [L,QSA]

I would remove last mentioned directive, but it is responsible for seo urls in opencart.

Please help me to write proper directives, preferably using rewriterule, rewritecond (not RedirectMatch). I’ve read some manuals, like http://datakoncepts.com/SEO but all i’ve tried don’t work:


RewriteCond %{HTTP_HOST} ^mysite\\.tld/store/$ [NC]
RewriteRule .? http://mysite.tld/$1 [R=301,L]
RewriteMap noname txt:/domens/mysite.tld/1.txt
RewriteCond %{HTTP_HOST} ^mysite\\.tld/store
RewriteRule ^(.*)$ http://mysite.tld/$1 [R=301,L]
RewriteRule ^mysite\\.tld/store/(.*)$ http://mysite.tld/$1 [R=301,L]

My current .htaccess:


# 1.To use URL Alias you need to be running apache with mod_rewrite enabled. 

# 2. In your opencart directory rename htaccess.txt to .htaccess.

# For any support issues please visit: http://www.opencart.com

Options +FollowSymlinks

# Prevent Directoy listing 
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\\.(tpl|ini|log)">
 Order deny,allow
 Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
# If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/ 

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]

# disabled in ocstore 1.5.3.1:
#RewriteRule ^yandexmarket.xml$ index.php?route=feed/yandex_market [L]

# to www 301 redirect (in case it will be needed)
# RewriteCond %{HTTP_HOST} !^www\\.
# RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# to non-www 301 redirect 
RewriteCond %{HTTP_HOST} ^www\\.
RewriteRule ^(.*)$ http://mysite.tld/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^(.*) index.php?_route_=$1 [L,QSA]

### Additional Settings that may need to be enabled for some servers 
### Uncomment the commands by removing the # sign in front of it.
### If you get an "Internal Server Error 500" after enabling any of the following settings, restore the # as this means your host doesn't allow that.

# 1. If your cart only allows you to add one item at a time, it is possible register_globals is on. This may work to disable it:
# php_flag register_globals off

# 2. If your cart has magic quotes enabled, This may work to disable it:
# php_flag magic_quotes_gpc Off

# 3. Set max upload file size. Most hosts will limit this and not allow it to be overridden but you can try
# php_value upload_max_filesize 999M

# 4. set max post size. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
# php_value post_max_size 999M

# 5. set max time script can take. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
# php_value max_execution_time 200

# 6. set max time for input to be recieved. Uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
# php_value max_input_time 200




# partially working redirect
#RedirectMatch 301 ^/store/(.*)$ http://mysite.tld/$1


areol,

Hmmm, this should be a simple redirection.

First, mod_alias, as part of Apache’s core, preempts mod_rewrite as it’s processed first. Once a redirection is made by mod_alias, mod_rewrite can come along and make its own redirection.

Second, your RewriteRule can work but it will ALWAYS match (because you’re requiring only the start anchor and ? will NEVER be found in a {REQUEST_URI} string - it delineates the end of the {REQUEST_URI} string and the start of the {QUERY_STRING}. Therefore, it’s just as “good” (IMHO, as TERRIBLE - and LOOPY) as (.*). Therefore, my first Standard Rant:

[standard rant #1][indent]The use of “lazy regex,” specifically the :kaioken: EVERYTHING :kaioken: atom, (.*), and its close relatives, is the NUMBER ONE coding error of newbies BECAUSE it is “greedy.” Unless you provide an “exit” from your redirection, you will ALWAYS end up in a loop![/indent][/standard rant #1]

You might benefit from reading the mod_rewrite tutorial linked in my signature as it contains explanations and sample code. It’s helped may members and should help you, tYou might benefit from reading the mod_rewrite tutorial linked in my signature as it contains explanations and sample code. It’s helped may members and should help you, too.

Regards,

DK

I’ve read your tutorial, regex to capture store/ is:

([a-zA-Z]+)/

Though it is not needed.

Regex to capture everything after store/ is not easy for me. It should include numbers and special characters like ? = _ - &
My best bet is :

store/([a-zA-Z0-9_-?=&]+)

So, everything should look something like:

RewriteCond %{HTTP_HOST} ^mysite\\.tld/store/$ [NC]
RewriteRule ^/store/([a-zA-Z0-9_-?=&]+)$ http://mysite.tld/$1 [R=301,L]

It’s not working, and this is best what i can think of right now (

areol,

You need to review a few things:

  1. The placement of the hyphen in a range definition makes it a metacharacter - e.g., to define a-d (a, b, c and d). To specify a hyphen character, it must be first (although last seems to be acceptable, too).

  2. The characters allowed with a URI are enumerated in a paper by Sir Tim Berners-Lee entitled Uniform Resource Identifiers (URI): Generic Syntax and you are attempting to use reserved characters. Clearly, if you violate the long-established rules for URIs, you will fail - as you have already proved.

Do you need the list of characters I use at http://wilderness-wally.com?

Regards,

DK