I want to change this URL:
example.com/services-details.php?service_id=1
To:
example.com/services-details/1
Here is the code for .htaccess
file
Options FollowSymLinks -MultiViews
RewriteEngine On
#SEO FRIENDLY URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-] )$ services-details.php?service_id=$1
Update (fixed)
Step 1:
Add this code in your .htaccess
file
Options FollowSymLinks -MultiViews
RewriteEngine On
# SEO FRIENDLY URL
# Redirect "/services-details.php?service_id=<num>" to "/services-details/<num>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d )$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]
# Rewrite "/services-details/<num>" back to "services-details.php?service_id=<num>"
RewriteRule ^(services-details)/(\d )$ $1.php?service_id=$2 [L]
Step 2: Add this code (on the top) inside the ` HTML element
<base href="/">
After the followed steps it should work.
Info
Don't forget to change the link name services-details
!
CodePudding user response:
RewriteRule ^([a-zA-Z0-9_-] )$ services-details.php?service_id=$1
The RewriteRule
pattern (ie. ^([a-zA-Z0-9_-] )$
) is only matching a single path-segment, whereas the requested URL has two, ie. /services-details/1
- you need to match service-details
.
And I'm assuming the service_id
is always numeric.
For example:
Options FollowSymLinks -MultiViews
RewriteEngine On
# SEO FRIENDLY URL
RewriteRule ^(services-details)/(\d )$ $1.php?service_id=$2 [L]
Since you are rewriting to the same, you might as well capture service-details
to avoid repetition.
There would seem to be no need for the filesystem checks, since I don't imagine /services-details/<number>
to match a file or directory?
Note that if you are changing an existing URL structure where the old URLs have been indexed by search engines or linked to by third parties then you should also implement a 301 redirect from the old URL (ie. /services-details.php?service_id=<number>
) to the new URL (ie. /services-details/<number>
) in order to preserve SEO.
For example, the following "redirect" would need to go before the existing "rewrite" (above):
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d )$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]
The QSD
flag is required to remove the original query string from from the redirect response.
Summary
Your .htaccess
file should look like this with the rules combined:
Options FollowSymLinks -MultiViews
RewriteEngine On
# SEO FRIENDLY URL
# Redirect "/services-details.php?service_id=<num>" to "/services-details/<num>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d )$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]
# Rewrite "/services-details/<num>" back to "services-details.php?service_id=<num>"
RewriteRule ^(services-details)/(\d )$ $1.php?service_id=$2 [L]