apache - Making RewriteRule portable/relative to the directory of the .htaccess file -



apache - Making RewriteRule portable/relative to the directory of the .htaccess file -

i have next rewriterule makes going domain.com/somepage/?page=3 301 redirected domain.com/somepage/3/:

rewritecond %{the_request} \?page=([0-9]+) [nc] rewriterule ^ /somepage/%1/? [r=301,l]

this in .htaccess file in somepage directory.

now, works fine... it's bit of hassle. have dozen pages paginated, in own directory. able re-create .htaccess file each directory , not have worry editing each one. example, want domain.com/someotherpage/?page=3 redirect domain.com/someotherpage/3/, i'd have edit respective .htaccess file , alter somepage part someotherpage.

it causes problems when re-create entire site different server. normally, site placed in root directory. however, when i'm running locally, place entire site in folder called dev. have go through of rewriterules , alter /somepage/%1/ /dev/somepage/%1. this, can imagine, incredibly tedious.

so, there way of changing path redirects relative .htaccess file, rather server's root, can reuse same .htaccess multiple times without changing it, , can move entire site dev directory without needing alter anything?

thanks.

you can rewrite base of operations dynamically captured using separate rule:

rewriteengine on rewritecond $0#%{request_uri} ^([^#]*)#(.*)\1$ rewriterule ^.*$ - [e=base:%2] rewritecond %{the_request} \?page=(\d+) [nc] rewriterule ^ %{env:base}/%1/? [r=301,l]

explanation:

you can utilize $0 captured rewriterule in rewritecond because mod_rewrite processes ruleset backwards. starts pattern in rewriterule, , if matches, goes on check 1 or more rewritecond. so can see in rewritecond, lhs (test string) can utilize backreference variables e.g. $1, $2 or %1, %2 etc rhs side i.e. status string cannot use these $1, $2 or %1, %2 variables. inside rhs status part backreference can utilize internal back-references i.e. groups have captured in status itself. denoted \1, \2 etc. in rewritecond first captured grouping ([^#]*). represented internal back-reference `\1. as can mark out rule finding rewritebase dynamically comparing %{request_uri} , $0. illustration of %{request_uri} /directory/foobar.php , illustration of $0 same illustration uri foobar.php. ^([^#]*)#(.*)\1$ putting difference in 2nd captured grouping %2 or \2. here populate %2 or \2 value /directory/ used later in setting env variable %{env:base} i.e. e=base:%2.

apache .htaccess mod-rewrite redirect

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -