Jaronimo
Jaronimo

Reputation: 33

htaccess add .html extension for urls with or without trailing slash

So to begin with I have a custom url rewrite that sends a request variable to a php script

Rewrite rule is below:

RewriteRule ^([\w\/-]+)(\?.*)?$ test/index.php?slug=$1 [L,T=application/x-httpd-php]

So if you access something like domain.com/slug-text it sends slug-text to index.php located in folder named test.

What I want is all my urls to look like domain.com/slug-text.html, but slug-test variable should still be sent to index.php file.

And

What I can't figure out is the redirect. I want all the old urls to be redirected from domain.com/slug-text or domain.com/slug-text/ to domain.com/slug-text.html and slug-text sent to index.php file located in test folder.

Searched a lot but could not find the answer for this question anywhere on the Internet.

Thank you all for the help.

UPDATE: my new code is:

RewriteEngine On
Options +FollowSymlinks

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-l
RewriteRule ^(([\w/\-]+)?[\w-])(?!:\.html)$ http://domain.com/$1\.html [L,R=301]
RewriteRule ^(([\w/\-]+)?[\w-])(/|\.html)?$ test/index.php?slug=$1 [L]

domain.com/slug-text/ does not get redirected to domain.com/slug-text.html domain.com/slug-text works as intended redirecting to domain.com/slug-text.html

What do i need to change?

Upvotes: 2

Views: 5556

Answers (2)

Ivan Hušnjak
Ivan Hušnjak

Reputation: 3503

This rule:

RewriteRule ^(([\w/\-]+)?[\w-])(/|\.html)?$ test/index.php?slug=$1 [L]

Will trap domain.com/slug-text, domain.com/slug-text/ and domain.com/slug-text.html and send slug-text to /test/index.php inside slug param.

If you really want to redirect using [R=301] from old urls to new then use this:

RewriteRule ^(([\w/-]+)?[\w-])/?(?!:\.html)$ http://domain.com/$1.html [L,R=301]
RewriteRule ^(([\w/-]+)?[\w-])\.html$ test/index.php?slug=$1 [L]

Also note that as using explicit redirect bottom rule is modified to trap url's ending with .html

It is also advisable (if your .htaccess does not already contain this) to filter conditions for existing files and folders not to be trapped by your redirect rules. Simply add these lines before RewriteRule lines:

# existing file
RewriteCond %{SCRIPT_FILENAME} !-f
# existing folder
RewriteCond %{SCRIPT_FILENAME} !-d

And if using symlinks:

# enable symlinks
Options +FollowSymLinks
# existing symlink
RewriteCond %{SCRIPT_FILENAME} !-l

// addition
Your .htaccess file should look like this:

RewriteEngine on
Options +FollowSymLinks
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-l
RewriteRule ^(([\w/-]+)?[\w-])/?(?!:\.html)$ http://domain.com/$1.html [L,R=301]
RewriteRule ^(([\w/-]+)?[\w-])\.html$ test/index.php?slug=$1 [L]

Upvotes: 3

Kamen
Kamen

Reputation: 699

This is supposed to redirect /slug-text to /slug-text.html

RedirectMatch ^/([\w-]+)/?$ http://domein.com/$1.html 

This is in the case when slug-text is only letters, digits, – and _. Rewrite slug-text.html to a php file and pass the slug as a param:

RewriteRule ^([\w-]+)\.html$ test/index.php?slug=$1 [R,L] 

If you have both line in your .htaccess the first one will do the redirects from the legacy URLs to the new ones and the second one will process the request.

Upvotes: 0

Related Questions