Vince Carter
Vince Carter

Reputation: 946

.htacces url_rewrite difficulties

I have a problem with the configuration of the .htaccess of small website that I'm working on.

I want all pages to be redirected to index.php?page=REQUEST and that file will find in the database the content for the requested page.

The problem occurs when I have installed a forum, so I want these forum pages to redirect to the index.php?page=forum&params

Options +FollowSymlinks

RewriteEngine on 
RewriteCond %{REQUEST_URI} /(.*).html

RewriteRule ^(.*)forum/category/(.*)?$ index\.php?page=forum&lang=$1&category=$2 [L]

RewriteRule ^(.*)/(.*)(\.html?)$ index\.php?lang=$1&page=$2 [L]
RewriteRule ^(.*)(\.html?)$ index\.php?page=$1 [L]

Evetything works fine, except the forum part. How do I need to change the .htacces?

Upvotes: 2

Views: 158

Answers (2)

Vince Carter
Vince Carter

Reputation: 946

RewriteEngine on 

RewriteRule \.(jpg|png|gif|svg|css|js)$ - [L]

RewriteRule ^(.*)/forum/topic/(.*)?$ index\.php?page=forum&lang=$1&topic=$2 [L]
RewriteRule ^(.*)/forum/category/(.*)?$ index\.php?page=forum&lang=$1&category=$2 [L]

RewriteRule ^(.*)/(.*)(\.html?)$ index\.php?lang=$1&page=$2 [L]
RewriteRule ^(.*)(\.html?)$ index\.php?page=$1 [L]

Upvotes: 1

hillsy
hillsy

Reputation: 689

The problem appears to be that your RewriteCond is matching requests that end in .html. As your forum URLs don't end in .html the condition for the subsequent RewriteRule is never met.

There are some other possible problems too:

  • ^(.*)forum will match www.url.com/en/ when it looks like you probably just want en

  • category/(.*) will match any characters, including forward slashes and the like. Presumably you just want it to match a decimal identifier.

  • Links to things that aren't covered by your rewrite config e.g. images

I'd probably rewrite your config to look something like this (N.B. not tested in Apache; only in a regex debugger):

RewriteEngine on    

# only match forum URLs
# e.g                url.com/en/forum/category/12345
RewriteCond %{REQUEST_URI} ^/.+/forum/category/[0-9]+
RewriteRule ^/(.+)/forum/category/([0-9]+) index.php?page=forum&lang=$1&category=$2 [L]

# match all URLs ending in .html
# e.g.            url.com/en/foo.html
# and                url.com/foo.html
RewriteCond %{REQUEST_URI} ^/.+\.html$

# a bit complicated, this matches both
#                      /apage.html
#               /folder/apage.html
RewriteRule ^(?:/(.+))?/(.+)\.html$ index.php?lang=$1&page=$2 [L]

The second RewriteRule should always provide a value for page but only provide a value for lang if the URL is of the form /lang/page.html. This should be OK if your index.php file can accept an empty lang parameter or supply a default value.

Alternatively, if you don't mind keeping your existing regex and it's only images, CSS etc you want to bypass in URL rewriting you can add some rules at the start to skip them e.g.

RewriteEngine on    

# don't actually rewrite, and stop processing rules
RewriteRule \.(jpg|png|css|js)$ - [L]

# only match forum URLs
# e.g                url.com/en/forum/category/12345
RewriteCond %{REQUEST_URI} ^/.+/forum/category/[0-9]+
RewriteRule ^/(.+)/forum/category/([0-9]+) index.php?page=forum&lang=$1&category=$2 [L]

etc...

Upvotes: 0

Related Questions