Apache rewrite exclude empty URI - html

The following rewrite appends .html to the URI.
RewriteRule ^/(.*)$ /sites/uk/$1.html [NC,L]
However, when it comes to the index page it is giving me:
.../sites/uk/.html instead of:
.../sites/uk/index.html
What I want to know is how to exclude an empty URI so it doesn't append .html to nothing. I have tried the following rewrite condition:
RewriteCond %{REQUEST_URI} !^/?$ However this is unsuccessful.

Related

Is there any possibility to remove ? and = in html?

I am trying to give pretty url for my html page. I found many answers but they are more related to php. I need to convert this link below,
http://localhost/blog.html?id=1
to
http://localhost/blog/1
I have the .htaccess file for removing html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Help me to change my url parameters.
The examples you find are perfectly valid for you, since this is independent of any higher level logic like php. These rules operate on the level of the http server.
Anyway, here is a rule to get you started:
RewriteEngine on
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)(?:&|$)
RewriteRule ^/?blog$ blog.html?id=%1 [END,QSD]
In case you get an http status 500 ("internal server error") using this then chances are that you operate a very only version of the apache http server. You will find a hint about an unsopported [END] flag in your http servers error log file in that case. Try replacing the END flag by the older L flag, that probably will work the same, though this depends a bit on your setup.

HTML apache rewrite to new directory

I have been working on this for over an hour, and clearly I'm missing something.
I need to redirect:
www.site.com/directory/file.php?m=12345 to www.site.com/file2.php?m=12345
No matter what I am doing, the rule is not met, the data is missed or the redirect tries to go to the same directory.
I am doing the redirect in .htaccess.
The RewriteEngine is on and other redirects are working.
There is not a stop before the rewrite to prevent the rule from being read.
I am using these flags NC, R, L
DirectoryIndex Default3.php Default3.PHP
#Block listing of folder contents
IndexIgnore *
RewriteEngine on
#Make access to image folder case insentive
RewriteRule ^images/(.*) Images/$1
RewriteRule ^common/(.*) Common/$1
#redirect old photo download page
RewriteRule GetZipPhotos.*(\d*) PhotoDownload.php?mls=$1 [NC,QAS,L]
Thanks for any help.
I have changed the .htaccess to
DirectoryIndex Default3.php Default3.PHP
#Block listing of folder contents
IndexIgnore *
RewriteEngine on
#redirect old photo download page
RewriteRule ^Agents_Admin/GetZipPhotos.php(.*) /PhotoDownload.php$1 [R,NC,L]
#Make access to image folder case insentive
RewriteRule ^images/(.*) Images/$1
RewriteRule ^common/(.*) Common/$1`
The rewrite is still not working. According to the htaccess tester this does catch the original URL and should redirect correctly. But it is not. The original file keeps getting ran.
RewriteRule ^/Agents\_Admin/GetZipPhotos.php$ /PhotoDownload.php [R,NC,L,QSA]
QSA means Query String Append, in the (.*) and $1 are only URI parts, not parameters

CodeIgniter URL Rewrite

I have found so many examples of URL Rewrite in CI, but not a final and good solution, i have url like this
www.somesite.com/index.php/tehnicki/tekstovi
I want to have url like this
www.somesite.com/about.html
This about is GET Variable, that is going in MySql Query, it will be no number it will be some NAME, how to do that?
And what i have to write in tehnicki controller to take that GET Variable, is there any helper in CI for MySQL Attack, or i have to write it on my own :)
Okay, let's see, it seems messed up and it doesn't make sense but I'll give you what you need.
First we will have to remove the index.php file :
- use this as .htaccess
//.htaccess
RewriteEngine on
RewriteCond $1 !^(index\.php|Skin|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
next, in your config.php set index_page to an empty string
// application/config/config.php
$config['index_page'] = '';
on the same file, scroll to url_suffix, and set it to .html
// application/config/config.php
$config['url_suffix'] = '.html';
now head to your routes.php and apply a rewrite rule
// application/config/routes.php
$route['about'] = "tehnicki/tekstovi";
I'll quickly explain what I did here so you get how it works:
1- we removed the index.php section of the url in order to clean it
2- we added a url suffix that will be generated on all the pages
3- we applied a rewrite rule that will match /about.html to the controller tehnicki and the action tekstovi (tehnicki/tekskovi)

How to avoid double google indexing using .htaccess?

I have a website, with a nice RewriteRule in its root, that redirects all the queries of this kind:
http://domain.com/foo/parameter
into
http://domain.com/index.php?args=parameter
Users can only see the clean URL and everyone is happy.
Now here is the problem: domain.com DNS have an A record for domain.com, pointing to a private server IP, and an A record for mail.domain.com, pointing to the exact same IP.
For some unknown reason, in the last couple of months, Google double indexed all the pages of my site (http://domain.com/foo/par1, http://domain.com/foo/par2 etc.) with another set with the mail subdomain (http://mail.domain.com/foo/par1, http://mail.domain.com/foo/par2 etc).
I thought I could get rid of all of them redirecting any request to mail.domain.com/$whatever to domain.com and eventually Google would understand that all those pages with the 'mail' subdomain redirects to the homepage and are therefore not necessary.
I tried this in .htaccess:
RewriteCond %{HTTP_HOST} ^mail.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com [R=301,L]
But this redirects to a visible URL that looks like this: http://domain.com/index.php?args=parameter, while I just want a redirect to the homepage.
What's the correct form, and are there more elegant ways to achieve this, maybe adding something into robots.txt? (Please note that I can't just disallow a subfolder here)
If you just want to redirect to home page by discarding the original REQUEST_URI and QUERY_STRING then use these rules:
RewriteCond %{HTTP_HOST} ^mail.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/? [R=301,L]
By putting ? in the end it will strip out original query string, thus a URL of this type: http://mail.domain.com/index.php?args=parameter will become http://domain.com/
Your rule is correct, but you need to put it before all the other rules (right after RewriteEngine On) or it will pick up the latest state of the internal rewritten URL.
Update: Hmm, you said that your old rule redirects correctly but is using the internal, ugly, URL. That actually shouldn't be the case unless you add $1 to pick out the matched string.
RewriteCond %{HTTP_HOST} ^mail.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]

Rewriteengine in .htaccess to catch files not ending in html

I'd like to use mod rewrite in to convert web page addresses like /directory to /directory/index.html, in a standard LAMP hosting situation. What I have works for addresses that end in a slash. I can't find a way to handle addresses that don't end a slash.
What seems like it should work is:
rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */
But the second line causes a 500 server error. If I add a single letter x to the second line:
rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]
It starts to work, but only for directory names that end in an x. I have tried replacing the x with many different things. Anything more complicated than real characters (like [^x] or .+) gives a 500 server error.
And, to satisfy my own curiosity, does anyone know why the addition of a single real letter makes the difference between a server error and a perfectly functioning rule?
[Accepted Answer] Thanks to Gumbo I was able to approximate a solution using rewritecond:
rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]
This works, but filters more than just .html -- it could block other pages. Unfortunately,
rewritecond %{REQUEST_URI} !\.html$
results in a server error:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.
I'd still like to know why:
rewriterule ^(.*(?!html))$ $1/index.html [L]
results in a loop. The first half is supposed to check if it doesn't end in .html. Since the second half adds .html, it seems like the functional equivalent of:
while(substr($address,-4)!='html') $address.='html'
Obviously I'm missing something.
Use a RewriteCond directive to check whether the URL path does not end with a .html:
RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]
Edit   You’re using a look-ahead assertion ((?!…)). But there isn’t anything after .* (only a $). So try a look-behind assertion instead:
RewriteRule ^.*$(?<!html) $0/index.html [L]
But note that you probably need Apache 2.2 to use these assertions.
Well, for actually making it work, you could just use a negative lookbehind instead of a lookahead:
RewriteRule ^(.*)(?<!html)$ $1/index.html [L]
I'm not sure offhand why adding the 'x' makes it work, I'll edit if I figure it out.
For why adding the x makes it work:
If the replacement will match the regex, the RewriteRule will be applied again. As an example, this causes an error:
RewriteRule ^(.*)$ $1.rb
because it would replace script with script.rb. That matches the regex, so it replaces script.rb with script.rb.rb, again and again...
This is hinted at in the error log:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.
In your example, you add index.html to the end. When there is an x at the end of the regex, then it won't match your replacement, which ends in an l.