.htaccess - Forcing the rewriting of URLs by hiding .php AND .htm(l) extensions and redirecting to extensionless URLs -


here configuration:

  • http://domain.com (obviously fictitious name...) hosted on server running apache mod_rewrite enabled
  • folder named "foo": (located @ http://domain.com/foo/ , in want put .htaccess file) containing 3 types of files .php, .htm, .html
    • .php files (for sake of example refer 1 of them: phpfile.php)
    • .htm files (for sake of example refer 1 of them: htmfile.htm)
    • .html files (for sake of example refer 1 of them: htmlfile.html)
  • within foo folder, no file has equivalent extension or without extension (ie eg neither phpfile.htm nor phpfile.html nor phpfile exist in foo, php.file.php exist)

here trying achieve:

i have been trying hard on this, , sofar i've came content .htaccess file (located in "foo" folder), unfortunately working in last of 2 cases, in interested (ie serving "phpfile.php" when request "phpfile", serving "htmfile.htm" when request "htmfile" or serving "htmlfile.html" when request "htmlfile"), , ignoring 301 redirections:

options +followsymlinks rewriteengine on rewritebase /foo  # redirect permanently requests existing .php files # extensionless files (non present on server) # phpfile.php gets redirected phpfile rewritecond %{request_filename} !-d rewritecond %{request_uri} \.php$ rewritecond %{request_filename}\.php -f  rewriterule (.*)\.php$ $1   [r=301,nc]  # redirect permanently requests existing .htm(l) files # extensionless files (non present on server) # htmfile.htm gets redirected htmfile # htmlfile.html gets redirected htmlfile rewritecond %{request_filename} !-d rewritecond %{request_uri} \.html?$ rewritecond %{request_filename}\.html? -f    rewriterule (.*)\.html?$ $1 [r=301,nc]  # matching requests non existing extensionless files # existing equivalent on server # domain.com/foo/phpfile display # contents of domain.com/foo/phpfile.php, rewritecond %{request_filename}\.php -f  rewriterule (.*)$ $1.php    [l]  # domain.com/foo/htmlfile display # contents of domain.com/foo/htmlfile.html, rewritecond %{request_filename}\.html -f     rewriterule (.*)$ $1.html   [l]  # domain.com/foo/htmfile display # contents of domain.com/foo/htmfile.htm, rewritecond %{request_filename}\.htm -f  rewriterule (.*)$ $1.htm    [l] 

thank in advance help/ advice.

there's logic flaw in first 2 rules in it's php or html file exists. uri check in effect duplicate of rewrite rule pattern , !f implies !-d. can fold these single rule:

rewritecond %{request_filename} -f rewriterule ^(.*?)\.(php|html?)$        $1   [r=301,nc] 

the last 2 ok, i'd swap order if html requests more common php

why multiviews doesn't help

options +multiviews implements concept known content negotiation, , in doing apache invokes subquery parse filename root name. 1 of things scan directory known filename.extension combinations in case if xxx.php exists , request xxx substitute xxx.php , internal redirection, causes first rule fire, removing .php extension , causes error see.

so (i) need disable multiviews, , (ii) ditto subqueries; (iii) detect , prevent retry loops. 1 solution want:

options +followsymlinks  -multiviews rewriteengine on rewritebase /foo  rewritecond %{env:redirect_end}  =1 rewriterule ^ - [l,ns]  rewritecond %{request_filename} -f rewriterule ^(.*?)\.(php|html?)$        $1   [r=301,nc,ns]  rewritecond %{request_filename}\.html -f rewriterule (.*)$ $1.html   [l,e=end:1,ns]  rewritecond %{request_filename}\.htm -f rewriterule (.*)$ $1.htm    [l,e=end:1,ns]  rewritecond %{request_filename}\.php -f rewriterule (.*)$ $1.php    [l,e=end:1,ns] 

Comments

Popular posts from this blog

html - Outlook 2010 Anchor (url/address/link) -

javascript - Why does running this loop 9 times take 100x longer than running it 8 times? -

Getting gateway time-out Rails app with Nginx + Puma running on Digital Ocean -