Php get content without question mark? - php

I get mysite.com/?file=abc
<?php if(!empty($_GET['file'])) {?>
<?php echo $_GET['file']; ?>
<?php } ?>
it's possible get value like this:
mysite.com/file/abc

If you are using apache, and your config allows for htaccess overrides,
you can create an .htaccess file like this
# Turn on URL rewriting
RewriteEngine On
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php?q=$1 [L]
URL
mysite.com/file/abc
In your php file do something like this
<?php
$query = explode('/', $_GET['q']);
if ($query[0] === 'file') {
echo $query[1];
}

Related

php GET variable gets interrupted with ampersand (&)

SOLUTION:
it seems htaccess requires 'B' for it to retain the ampersand
so using
RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L,B]
works
SOLUTION
I am trying to read the get value from the url which is:
view.php?album=something
This is one of my rules in my .htaccess file:
#this rewrite 'view.php?album=something' to 'album/something'
RewriteRule ^album/([^/\.]+)/?$ ^view.php?album=$1 [L]
The problem is that sometimes the album name ie 'something' may contain and & in the name and this causes $_GET to trip up.
**For example**
album name is 'football&basketball'
The view.php page will only read up to football and throw an error.
Without the rewrite rule it works perfectly fine, but with the rewrite rule it messes up for that one case.
I am using rawurlencode at the moment
If there is no & in the name then it also works fine - its only with the & when it messes up
Does anyone have any suggestions on how to overcome this? I have tried using htmlspecialchars and htmlentities etc.
EDIT: Added Code
htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
#rewrite view.php?album=whatever to album/whatever
RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteBase /ShyamJoshi/dist/
#remove .php and .html extension
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteOptions Inherit
ReWriteCond %{HTTP:accept-encoding} (gzip.*)
ReWriteCond %{REQUEST_FILENAME} !.+\.gz$
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.+) $1.gz [QSA,L]
</IfModule>
PHP:
This function is being used twice. First it shows all directories and then it shows all images in directories (which is the 'else' part)
function getImagesOrImageDirs($dirOnly) {
$dirLoc = getcwd() . '/images/events/';
$allDirs = preg_grep('/^([^.])/', scandir($dirLoc));
echo '<div class="row">';
if ($dirOnly == true) {
foreach($allDirs as $dir) {
$innerDirImages = preg_grep('/^([^.])/', scandir($dirLoc.'/'.$dir));
$firstImageOfDir = reset($innerDirImages);
/* view.php?album=something -> rewritten by htaccess to albums/something*/
$href = 'album/'.$dir;
// $href = 'album/'.$dir;
$imageSrc = 'images/events/'.$dir.'/'.$firstImageOfDir;
echo albumAndPhotoTemplate($href, $imageSrc, true, $dir, 'col-xs-12 col-sm-3');
}
} else {
if (empty ($_GET['album']) ) {
return ;
}
$albumName = $_GET['album'];
print_r($albumName);
$dirLoc = $dirLoc .'/'.$albumName;
$allImages = preg_grep('/^([^.])/', scandir($dirLoc));
foreach($allImages as $image) {
$imgSrcAndHref = 'images/events/'.$albumName.'/'.$image;
echo albumAndPhotoTemplate($imgSrcAndHref, $imgSrcAndHref, false, '', 'col-xs-12, col-sm-3');
}
}
echo '</div>';
}
Try like this..
RewriteEngine On
RewriteRule ^album/([a-zA-Z0-9-=_.]+)$ view.php?album=$1 [L]
Get your variable using
$_GET['album'];
If you want to both variable and name:
print_r($_GET);
To escape & on url use %26 like this..
view.php?album=something%26basketball
See more here escaping ampersand in url

Htaccess rewrite rules for this url

I just started to learn htaccess and i'd like to rewrite my current urls from this:
http://www.url.com/?location=script
To:
http://www.url.com/script
So far i've managed to do this but now i want to have a directory with more controllers so i can have something like this:
http://www.url.com/script/method
Structure: Script directory --> method.php
Currently my directory structure for includes its like this:
assets-->client(directory):
login.php
logout.php
register.php
something.php
And i'd like to access these using a url like:
url.com/client/login
url.com/client/logout
url.com/client/register
url.com/client/something
My .htaccess:
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?location=$1 [L]
</ifModule>
PHP based inclusion code:
####################################################################
# PARSE THE CURRENT PAGE #
####################################################################
$includeDir =".".DIRECTORY_SEPARATOR."assets/controllers".DIRECTORY_SEPARATOR;
$includeDefault = $includeDir."home.php";
if(isset($_GET['ajaxpage']) && !empty($_GET['ajaxpage'])){
$_GET['ajaxpage'] = str_replace("\0", '', $_GET['ajaxpage']);
$includeFile = basename(realpath($includeDir.$_GET['ajaxpage'].".php"));
$includePath = $includeDir.$includeFile;
if(!empty($includeFile) && file_exists($includePath)) {
include($includePath);
}
else{
include($includeDefault);
}
exit();
}
if(isset($_GET['location']) && !empty($_GET['location']))
{
$_GET['location'] = str_replace("\0", '', $_GET['location']);
$includeFile = basename(realpath($includeDir.$_GET['location'].".php"));
$includePath = $includeDir.$includeFile;
if(!empty($includeFile) && file_exists($includePath))
{
include($includePath);
}
else
{
include($includeDefault);
}
}
else
{
include($includeDefault);
}
All my controllers are in assets/controllers/ucp/login.php for example.
How about:
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^(/client/[a-zA-Z0-9_\-]+)$
RewriteRule ^[a-z]+ index.php?location=$2 [L]
</ifModule>
It does include a leading slash and doesn't have the PHP extension. But this can be altered in PHP to suit your needs.
Be wary though, your code gives access to all your PHP files. You might want to check $_GET['location'] against an array of allowed locations. Consider the following URL as example of how this could go wrong
http://example.com/index.php?location=../drop_database.php

Apache + PHP without ".php" File Extension but Including Path Info

I'm trying to figure out how to modify the .htaccess file so I can do two things:
Not have to include the .php extension on my PHP files (e.g., a request to my.domain.com/page maps to my.domain.com/page.php).
Do #1 while also including additional path info (e.g., a request to my.domain.com/page/path/stuff/here maps to my.domain.com/page.php/path/stuff/here).
I've found out how to do #1 by adding the following to the .htaccess file:
# Allow PHP files without ".php" extension.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/?$ /$1.php [L,QSA]
However, now I'd like to modify the RewriteRule so it works for #2.
OK, after searching for MultiViews, I found several articles warning against them (eh, to each his own), but that also led me to an answer that uses 2 rules instead of just 1:
RewriteRule ^([^\.]+)$ /$1.php [L]
RewriteRule ^([^\./]+)/(.*) /$1.php/$2 [L]
The first rule catches case #1 above, and the second rule catches case #2 above. Voila!
You could just try to use Multiviews, which is made to do exactly this:
Options +Multiviews
RewriteEngine On # Turn on the rewriting engine
RewriteRule ^([^\.]+)$ $1.php [NC,L] #Remove the .php
Not sure what you want with the pathing stuff though.
Edit based off your comment, I've used something like this with php/angular. It's probably not "correct" or the best way to do it, but it worked for me.
Htaccess
RewriteEngine on
# Allow the API to function as a Front Controller
RewriteRule ^api/(.*)$ api/index.php?rt=$1 [L,QSA,NC]
# Allow Angular to have Pretty URL's
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
api/index.php
// Pull the routing path
$router = explode('/', $_GET['rt']);
$version = $router[0];
$controller = $router[1];
$action = $router[2];
// Check for the file
if(file_exists($version . '/controllers/' . $controller .'.class.php')) {
include $version . '/controllers/' . $controller .'.class.php';
} else {
return false;
}
// Initialize and execute
$method = new $controller($action);
print $method->$action();
This lets me do something like: api/v1/users/login in the url, then will find the users.class.php file in the V1 folder, and run the function login.

Filter outgoing html files

I have custom syntax in all *.html files which need to be filtered by filter.php before being served. I am assuming that this can be done with .htaccess.
Note, I do not wish to parse *.html as PHP.
In your htaccess, add
RewriteRule (.*\.html) filter.php?htmlfile=$1
Now, in filter.php, you can
$html = file_get_contents($_GET['htmlfile']);
// and do whatever you need to do
// then
echo $html;
in ur htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)\.html$ controller.php?file=$1 [NC,L]
in ur php file u can have
if(isset($_GET["file"])
{
file logic ......
redirect code
}

Rewrite Url Parameters - Change http://myweb/?dept=dept&app=app to http://myweb/dept/app

I've currently got a web application that I need optimizing, and one of methods or something I'm trying to achieve is such:
http://myweb/dept/app
from
http://myweb/?dept=dept&app=app
I've currently this as the PHP code for it:
if(empty($_REQUEST['dept'])) {
$folder = "apps/";
} else {
$folder = str_replace("/", "", $_REQUEST['dept']) . "/"; }
if(empty($_REQUEST['n'])) {
include('user/home.php');
} else {
$app = $_REQUEST['n'];
if(file_exists($folder.$app.".php")) {
include($folder.$app.".php");
} else {
include("global/error/404.php");
}
}
How do I do this?
I'm currently half there with:
RewriteRule ^([A-Za-z]+)$ /index.php?app=$1
but that only rewrites part of it.
Thanks
The way many frameworks do this is with one of the following rules:
RewriteRule ^(.*)$ /index.php?q=$1
RewriteRule ^(.*)$ /index.php
In the 1st case you get the query string in $_GET["q"].
In the 2nd case you have to get the query string from $_REQUEST or something. (just do some var_dumps till you find what you need).
Then you explode("/") this and you're all set.
Have a look at how TYPO3, eZPublish, Drupal do this.
You should also add the following conditions to allow the site to open your static files (like images/css/js/etc). They tell apache to not do the rewrite if the URL points to a location that actually matches a file, directoy or symlink. (You must do this before the RewriteRule directive)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
This should work:
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)$ index.php?dept=$1&app=$2 [QSA]
You need the QSA part in order for any GET parameters to be appended to the rewritten URL.
You might find that it can be more flexible to rewrite everything to index.php, and then handle splitting up the url there, e.g.
.htaccess:
#only rewrite paths that don't exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
PHP:
<?php
$parts = explode('/', $_SERVER['PATH_INFO']);
$dept = isset($parts[0]) ? $parts[0] : 'someDefault';
$app = isset($parts[1]) ? $parts[1] : 'anotherDefault';

Categories