开发者

URL Rewriting using .htaccess

To change the URL /mobiles.php?id=5 to /mobiles/5

The content of .htaccess file is as follows:

Options +FollowSymlinks
RewriteEngine on

RewriteRule /mobiles/$1 ^/mobiles.php?id=([0-9]+)$

But still it is showing /mobiles.php?id=5 in the address bar. Please help. Is there anything else needs to be added in the .htaccess file?

Note:

  1. mod_rewrite module is enabled
  2. I have restarted Apache server after making ch开发者_JS百科anges to the .htaccess file
  3. .htaccess file is in htdocs folder of Apache.
  4. I am using Windows + PHP + Apache + MySQL


This works for me:

Options +FollowSymlinks

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^mobiles/([0-9]+)$ mobiles.php?id=$1&rew [L]

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^mobiles.php$ /mobiles/%1? [R,L]

If you see this line:

RewriteRule ^mobiles/([0-9]+)$ mobiles.php?id=$1&rew [L]

I have added rew variable in the query string to prevent Apache to fall in an infinite loop

When Apache execute this line:

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$

Is to make sure that url has not been rewritten for Apache


If your only concern is that the old url stays in the address bar, and you want this not to happen, try adding an [R] at the end.

RewriteRule ^/mobiles.php?id=([0-9]+)$ /mobiles/$1 [R]

Did you actually see the correct page?

By the way, the rewrite rules generally go the other way. I would be expecting to see something like:

RewriteRule ^/mobiles/([0-9]+)$ /mobiles.php?id=$1 

Is your concern one of making sure a URL with query parameters does not show up in the address bar?


If I understand correctly, you want

  • Internally redirect /mobiles/5 to /mobiles.php?id=5
  • Also redirect the browser TO /mobiles/5 if a user navigates to /mobiles.php?id=5

For this you need 2 rules one to internally rewrite the URL for 1st case and 2nd for browser redirection.

You can do it like this:

RewriteEngine on

# for internal rewrite
RewriteRule ^/?mobiles/([0-9]+)/?$ /mobiles.php?id=$1 [L]

# for browser redirect
RewriteRule ^/?mobiles\.php\?id=([0-9]+)$ /mobiles/$1/ [R,L]


You are doing the opposite, should be:

RewriteRule ^/something/mobiles/([0-9]+)$ /something/mobiles.php?id=$1
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜