1

I am trying to rewrite the URL of my website for PHP page I have different conditions

 first example.com/view.php?id=1

Here I need to hide id from the URL I need it like this

example.com/view/1

second, for some page, I have different variable like this example

example.com/view/book.php?id=1&user=33333&booked=1

I need to rewrite link to this example

example.com/view/book/1/33333/1

here is what I did in .htaccess page

# Remove .php file extension on requests
RewriteRule ^(.+).php$ /$1 [R,L]

RewriteRule ^(view/booked)/([0-9]*)$ $1.php?id=$2 [END]

# Append .php extension for other requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ /$1.php [END]

RewriteRule ^(view/book)/([0-9]*)/([0-9]*)/([0-9]*)$ $1.php?id=$2&user=$3&booked=$4 [END]

for example 1 it works well example.com/view/1 without any problem and for example.com/view/booked/1 as well.

The only problem with the second example example.com/view/book.php?id=1&user=33333&booked=1 I need to hide variables

2 Answers 2

1

With your shown samples please try following .htaccess rules.

Please make sure to:

  • Clear your browser cache before testing your URLs.
  • Please make sure your .htaccess file is residing along with view folder AND view.php in same root folder.

RewriteEngine ON

##Redirect from example.com/view.php?id=1 To example.com/view/1 rules.
RewriteCond %{THE_REQUEST} \s/([^.]*)\.php\?id=(\d+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]

##Internal handling to rewrite to view.php file.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/?$ $1.php?id=$2 [QSA,L]

##Redirect from example.com/view/book.php?id=1&user=33333&booked=1 TO example.com/view/book/1/33333/1
RewriteCond %{THE_REQUEST} \s/(view)/([^.]*)\.php\?id=(\d+)&user=(\d+)&booked=(\d+)\s [NC]
RewriteRule ^ /%1/%2/%3/%4/%5? [R=301,L]

##Internal handling to rewrite to book.php file.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)?$ $1/$2.php?id=$3&user=$4&booked=$5 [QSA,L]
Sign up to request clarification or add additional context in comments.

Comments

1

I recommend to keep things clear and precise. That probably is what you are looking for:

RewriteEngine on

# redirect /view/book.php?id=1&user=33333&booked=1 => /view/book/1/33333/1
RewriteCond %{QUERY_STRING} ^id=(\d+)&user(\d+)&booked=(\d+)$
RewriteRule ^/?view/book\.php$ /view/book/%1/%2/%3 [R=301,END]

# redirect /view.php?id=1 => /view/1
RewriteCond %{QUERY_STRING} ^id=(\d+)$
RewriteRule ^/?view\.php$ /view/%1 [R=301,END]

# rewrite /view/1 => /view.php?id=1
RewriteRule ^/?view/(\d+)$ /view.php?id=$1 [END]

# rewrite /view/book/1/33333/1 => /view/book.php?id=1&user=33333&booked=1
RewriteRule ^/?view/book/(\d+)/(\d+)/(\d+)$ /view/book.php?id=$1&user=$2&booked=$3 [END]

# rewrite to php files, if those exist
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [END]

It probably makes sense to start using R=302 temporary redirections first. And to only change those to R=301 permanent redirections once everything works as desired. That prevents nasty caching issues on the client side. Also you always want to test using a fresh anonymous browser window.

Best place to implement such rules is in the central http server's host configuration. If you do not have access to that you can use a distributed configuration file instead (".htaccess"), if you have enabled the consideration of such files in the http server ... Above rules will work likewise if that file is placed inside the DOCUMENT_ROOT folder of the http host.

2 Comments

Hi @arkascha I got an error when I try to visit example.com/view/book/1/1/1 Not Found The requested URL was not found on this server. Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
I don't spot an immediate issue with the code above. You will have to debug. Is that 404 raised on protocol level or by your script? Does the script /view/book.php exist, is it actually called or not? Where did you place that configuration file and how did you enable the http server to interpret such files?

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.