Redirect non-existant site pages via .htaccess - html

I have a problem right now with visitors browsing to pages that used to exist on my server but no longer. This is due to my initially poor decision to use a subdirectory instead of a subdomain. Because of this, people posted direct links to the pages themselve instead of the directory to various message boards. So when people Google and find links to my site, they click what the people have linked and it directs them to a "Not Found" page.
To better explain, here is my best attempt at giving an example.
The main URL people were using to visit my site was hxxp://example.com/subsite/. Within that /subsite/ directory there were files such as welcome.html, about.html, contact.html. So what happened is that when people started spreading my website links around, they would spread a link such as hxxp://example.com/subsite/welcome.html instead of just hxxp://example.com/subsite/. As of right now, the subsite directory only has (mainly) an index.html file.
What I am trying to accomplish is that whenever someone tries to navigate to any webpage within that subdirectory that doesn't exist, it redirects them to the index.html file. I'd like to accomplish this via the .htaccess file.
I attempted to do this myself by using the below code, but apparently I'm too new to how the .htaccess and apache modules work and the below code causes a constant redirect loop.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ hxxp://example.com/subsite/ [L,QSA]
</IfModule>
If anyone has any input, or needs me to clarify any information just let me know. Any help would be greatly appreciated. Thank you!

You can use:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(subsite)/.+$ /$1/ [L,NC,R=301]

Related

Subdirectory is being accessed instead of a html file of the same name

So, I've just got my .htaccess file working and it removes the .html extensions just fine. However, I now have a problem where a url pointing to my work page www.mywebsite.com/work is now targeting the subdirectory work which contains all the specific project files that can be accessed via the work.html page. I made the subdirectory because I want the url string to read as www.mywebsite.com/work/project-name whilst also having a clean and organised root folder instead of filling it up with 100+ html files.
I've searched for a solution all day but I feel like my limited knowledge is causing me to overlook the answer, so I apologise if this is a dupe. I thought I'd ask specifically on here as a last resort. Would love any suggestions from you, and if this already has a clear answer, please mark this as a dupe and point me in the right direction!
Incase it might help, the contents of my .htaccess file are as follows:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]*
I finally found a good solution to this that also follows the fix admitted by Amit.
Firstly, add DirectorySlash Off
then I removed RewriteCond %{REQUEST_FILENAME} !-d
and finally I removed the "!" from "!-f". Overall, the .htaccess should look like this:
DirectorySlash Off
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Solution was found in this post.

Need to redirect missing URLs to new host

I'm moving a blog from one site to another and repurposing the original site. I want to maintain all existing links that point to the site and hopefully maintain SEO page ranking.
Old URL: http://www.companyabc.com/2010/04/test.html
New URL: http://blog.companyabc.com/2010/04/test.html
The way I'd like to do it is to use a custom 404 error page on www.companyabc.com like this:
<html><meta http-equiv="REFRESH" content="0;url=http://blog.companyabc.com/%1"></html>
where %1 is the original URI (/2010/04/test.html), but I don't know if that's possible.
Another option is to use an .htaccess file that redirects if the URL is not found, but I haven't gotten that to work either. I'm sure I'm doing something wrong in the rewrite condition:
RewriteEngine On
RewriteCond %{REQUEST_URI} !-l
RewriteRule ^(.*)\.html$ https://blog.companyabc.com/$1.html [R=301,L]
Any suggestions? Thanks for the help.
I got it working using the following .htaccess configuration:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://blog.companyabc.com/$1 [R=301,L]
I never tried the REQUEST_FILENAME value because I mistakenly thought it only applied to files that can be downloaded from the website. I didn't realize it also applies to the .html files in the blog.
With this solution all URLs that don't exist at www.companyabc.com will be redirected to blog.companyabc.com instead of showing a 404 error page, which is what I'm looking for.

How to fix my htaccess, it's redirecting my pages all to one index

I was on live chat with my domain support and they managed to delete the default htaccess file, now every url entered goes to my main index, what can I do to fix this?
Example:
domain: example.com
If I have a folder under example.com/folder
and go to it, the index for example.com shows instead of for that folder and if I put the path directly it stays in the browser but it shows the index for example.com always.
What can I write in my htaccess to fix this to how it used to be and keep mod rewrite enabled?
Edit: also, every time I've asked them to fix it or reset it to default they claim that it's a web development issue and not theirs. All they do is tell me to contact my developer.
hopefully, it works
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#This last condition enables access to the images and css folders, and the robots.txt file
RewriteCond $1 !^(index\.php|public|images|robots\.txt|css)
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

index.html is not loading as default home page

I've offered to help a friend by hosting their website (using my account with iPage), however there's an issue I can't resolve. The homepage, FirstnameSurname.com, returns a 404 error.
The namepointers are working correctly as I can access www.FirstnameSurname.com/index.html, however when trying to load www.FirstnameSurname.com it returns the 404.
I've tried changing the folder name (on the server) from FSurname to FirstnameSurname so it matches the domain but it fixes nothing.
Poking around in the htcaccess file I've not been able to fix it either, even when adding DirectoryIndex index.html.
What is going on? How can I fix this problem? Any help greatly appreciated!
This might work on htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.html [L]

webpage returning 403 error and not showing the actual page

I have a page on my website ( it's html ) which is named "providers.html".
in order to remove the .html part from url, I added this code to .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
now the problem is that I have a folder which is named "providers" and contains files related to that page.
now when I go to the url, I get a 403 error because browser loads the folder and not the html page.
I really appreciate if any one can give me some guidance to solve this problem.
thanks
This might be what you're looking for:
DirectorySlash Off
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ([^\.]+) $1.html [NC,L]
Turned off directory slashes. This part is the most important part. Basically, if a directory exists, it shouldn't add a slash. This way, we can continue checking rules against exact URI input.
Added a check to see if the the current request does not end with a slash.
If it doesn't, rewrite to the respective HTML file
Otherwise, load up the contents of the directory. You'll more than likely want to have another .htaccess file in there to prevent listings etc., and only allow access to existing files.
Update: Removed ^ and $ from the rule, as I don't believe it is necessary here.