2

I'm trying to redirect the URLs of a client's website like this:

www.localsite.com/immobile.php?id_immobile=24

In something like this:

www.localsite.com/immobile/24.php

I'm using this rule in .htaccess but it returns a 404 error page.

RewriteEngine On
RewriteCond %{QUERY_STRING} ^id_immobile=([0-9]*)$
RewriteRule ^immobile\.php$ http://localsite.com/immobile/%1.php? [L]

I have tried many other rules, but none work. What can I do?

2 Answers 2

1

Try something like this:-

RewriteEngine On
RewriteRule id_immobile/(.*)/? immobile.php?id_immobile=$1 [NC,L]

Let me know how that looks and what the end result is if it doesn't work...

Edit

Please could you just test something for me by trying this one (from here):-

RewriteEngine On
RewriteBase /

# To externally redirect /dir/foo.php?id=123 to /dir/foo
RewriteCond %{THE_REQUEST} ^GET\s([^.]+)\.php\?id=([^&\s]+) [NC]
RewriteRule ^ %1/%2? [R,L]

# To internally forward /dir/foo/12 to /dir/foo.php?id=12
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/([^/]+)/?$ $1.php?id=$2 [L,QSA]

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^GET\s([^.]+)\.php\s [NC]
RewriteRule ^ %1 [R,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*?)/?$ $1.php [L]
8
  • Thank you for the answer. I've tryed with your code but it doesn't work. The URL before mod_rewrite and after is the same: localsite.com/immobile.php?id_immobile=XXX
    – Cristian
    Feb 18, 2014 at 11:21
  • Are you sure you implemented it correctly as it should definitely have changed the URL. What else do you have in your .htaccess?
    – zigojacko
    Feb 18, 2014 at 11:45
  • This is my .htaccess (without the MOD_Deflate compression): RewriteEngine on RewriteBase / RewriteRule ^index.php$ terrenocasa.it [R=301,L] RewriteEngine On RewriteRule id_immobile/(.*)/? immobile.php?id_immobile=$1 [NC,L] errorDocument 404 terrenocasa.it/errore.php <Files .htaccess> order allow,deny deny from all </Files>
    – Cristian
    Feb 18, 2014 at 12:04
  • Sorry for the format. It looks very confused. But I can't answer to my question for now with preformatted text.
    – Cristian
    Feb 18, 2014 at 12:07
  • @Christian - please see my updated answer.
    – zigojacko
    Feb 18, 2014 at 12:38
1
RewriteCond %{QUERY_STRING} ^id_immobile=([0-9]*)$
RewriteRule ^immobile\.php$ http://localsite.com/immobile/%1.php? [L]

Like you say in your first sentence, you want to redirect from one URL to the other. Currently your RewriteRule performs an internal rewrite, not an external redirect, which I believe is your goal. Simply add the R=301 flag to your current RewriteRule:

RewriteRule ^immobile\.php$ http://localsite.com/immobile/%1.php? [R=301,L]

(Is there any reason to keep the .php extension?)

This should also come towards the top of your .htaccess file.

However, this is only half the process, which is probably why you are getting a 404. You will need to do an internal rewrite back to the actual URL (with a query string) in order to complete the process (careful to avoid a redirect/rewrite loop).

5
  • No, there is no reason to keep the php extension. I had already tried with R=301 but it didn't work. Maybe I've done things uncorrectly. Sorry for the ignorance. What do you mean with an internal rewrite to the actual URL? I have to do another RewriteRule in htaccess?
    – Cristian
    Feb 18, 2014 at 15:24
  • "it didn't work"? - You got a 404 presumably? Because... /immobile/24.php is your "pretty" URL - it is virtual and doesn't exist as an actual file on the system. You need to internally rewrite it back to the real URL ie. /immobile.php?id_immobile=24. You have presumably already changed all your links to the /immobile/24.php format? (I assume you are implementing "pretty" URLs?)
    – MrWhite
    Feb 18, 2014 at 15:30
  • Geoff has been trying to do the second part (internal rewrite) for you. Geoff's code (top bit) should be used in addition to the redirect above (with the R=301 flag). You need both parts.
    – MrWhite
    Feb 18, 2014 at 15:34
  • Take a deep breath, have a cup of tea... ;) Well, you did specifically ask about a "redirect" - which I have answered above. However, it does look like you are implementing what is commonly called "pretty (or user friendly) URLs" on an existing site. Is this the case? If so, you need to know the difference between an "external redirect" and an "internal rewrite". Also, if this is an existing site and you are changing an existing URL structure (which is what I assumed) then you will need more than just a single rewrite.
    – MrWhite
    Feb 19, 2014 at 13:29
  • Yes, it's an existing website done by another agency. The customer asked me if it was possible to change the URL, and I told him that I would try. But I do not understand this. If it is a complicated thing I tell him to let it go .. It is not the job for which he hired me. Thank you very much to you and @Geoff. Thank's.
    – Cristian
    Feb 19, 2014 at 14:18

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.