I am confused while configuring the url using htaccess and php switch - php

I want to write a project with regular files. The index file has a php code where all the files opened in the URL are switches. Like for example:
index.php
<?php
if(isset($_GET['page'])){
$current_page = isset($_GET['page']) ? $_GET['page'] : '';
}else{
$current_page = 'index';
}
$result = str_replace(".php","", $current_page);
switch($result){
case 'welcome':
include('sources/welcome.php');
break;
case 'index':
include('sources/index.php');
break;
case 'profile':
// Here is the problem. I want to make Facebook style user profile system
// But the switch can not see profile username because it is working just for page names not usernames
break;
}
?>
Like the code in the index.php file, I call the pages with the switch. But everything changes when the user opens the profile page. Because I want to make the profile pages of the members just like Facebook. Like http://www.mywebproject.com/username
My created htaccess is here:
.htaccess
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
RewriteRule (?:^|/)([\w-]+)/?$ profile.php?username=$1 [L,QSA]
My question is this. How can I call members' profiles with their username in switch.

How can I call members' profiles with their username in switch because there is no every username in $thePage array.
Just pass everything to the index.php
.htaccess:
# Activate rewrite engine
RewriteEngine on
RewriteBase /root/
# If the request is not for a valid directory, file or symlink
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
# Redirect all requests to index.php
RewriteRule ^(.*)$ index\.php?/$1 [QSA]
You just pass the $_REQUEST['username'] to the profile.php and then you render your page.
Something like:
index.php
// you can do this better, this is just an example:
$request_uri = $_SERVER['REQUEST_URI'];
$params_offset = strpos($request_uri, '?');
$request_path = '';
$request_params = [];
echo 'request_uri = ', $request_uri, '<br>', PHP_EOL;
if ($params_offset > -1) {
$request_path = substr($request_uri, 0, $params_offset);
$params = explode('&', substr($request_uri, $params_offset + 1));
foreach ($params as $value) {
$key_value = explode('=', $value);
$request_params[$key_value[0]] = $key_value[1];
}
} else {
$request_path = $request_uri;
}
echo 'request_path = ', $request_path, '<br>', PHP_EOL;
echo 'request_params = ', PHP_EOL; print_r($request_params);
if (preg_match('~/root/(photos|videos|albums)/([\w-]+)~', $request_uri, $match)) {
print_r($match);
unset($match);
require_once('photos_videos_albums.php');
} else if (preg_match('~/root/([\w-]+)~', $request_uri, $match)) {
$username = $match[1];
unset($match);
require_once('profile.php');
} else if ($request_path == '/root/') {
echo 'HOME';
exit();
} else {
header('HTTP/1.0 404 Not Found');
echo "<h1>404 Not Found</h1>";
echo "The page that you have requested could not be found.";
}

Related

limit subdirectories to logged in users

How can i do the below probably .htaccess ?
/sp/sitea => /check.php?page=sitea #no trailing forward slash
/sp/sitea/ => /check.php?page=sitea #trailing forward slash
/sp/sitea/index.php => /check.php?page=sitea/index.php #includes a file
/sp/siteb => /check.php?page=siteb
/sp/index.php , /sp/login.php => no redirect
I then want to check the DB using PHP for sitea to see if the user is logged in and then redirect to /sp/sitea If they are not logged in for that site redirect to /login.php
I tried .htaccess below , in sp folder, but doesnt redirect, im not really .htaccess master
RewriteEngine On
RewriteCond %{REQUEST_URI} /
RewriteRule ^\/(.*)$ sp/check.php?path=$1 [L]
I solved this with a modified .htaccess file
RewriteEngine on
RewriteOptions MaxRedirects=2
RewriteBase /
#dont check non pages
RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|png|css|js)$
RewriteRule ^(.*)/(.*)$ /sp/check.php?path=$1&path2=$2 [L,P] #P keeps address in bar after redirect
check.php
<?php
//htaccess redirects here for sitepreview subdomains, then do authentication check and output the html
//cant redirect to page or get redirect loop
session_start();
$dir = $_GET["path"];
$dir2 = $_GET["path2"];
//echo $dir;
if(!isset($_SESSION['login_user'])){
header("Location: /sp/index.php",true,301);
exit();
}else {
$name = $_SESSION['login_user']["name"];
if($name == $dir) {
$homepage = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/sp/$dir/" . (isset($dir2) && strpos($dir2, ".htm") ? $dir2 : "index.html") );
echo $homepage;
}
else {
header("Location: /sp/index.php",true,301);
exit();
}
exit();
}

The page isn't redirecting properly, This webpage has a redirect loop htaccess php?

I have redirect loop in when I select a category of posts below is my htaccess file:-
<IfModule mod_rewrite.c>
# Enable mod_rewrite
RewriteEngine On
# Specify the folder in which the application resides.
# Use / if the application is in the root.
RewriteBase /
# Rewrite to correct domain to avoid canonicalization problems
RewriteCond %{HTTP_HOST} !^www\.rswebtek\.in
RewriteRule ^(.*)$ http://www.rswebtek.in/$1 [R=301,L]
# Rewrite URLs ending in /index.php or /index.html to /
RewriteCond %{THE_REQUEST} ^GET\ .*/index\.(php|html?)\ HTTP
RewriteRule ^(.*)index\.(php|html?)$ $1 [R=301,L]
# Rewrite category pages
RewriteRule ^.*-c([0-9]+)/page-([0-9]+)/?$ index.php?CategoryId=$1&Page=$2 [L]
RewriteRule ^.*-c([0-9]+)/?$ index.php?CategoryId=$1 [L]
#Redirect search results
RewriteRule ^search-results/find-(.*)/page-([0-9]+)/?$ index.php?SearchResults&SearchString=$1&Page=$2[L]
RewriteRule ^search-results/find-?(.*)//?$ index.php?SearchResults&SearchString=$1&Page=1 [L]
#Redirect tag search results
RewriteRule ^tagged/([^/]+)/page-(\d+)/?$ index.php?TagSearchResults&TagName=$1&Page=$2 [L,QSA]
RewriteRule ^tagged/([^/]+)/?$ index.php?TagSearchResults&TagName=$1&Page=1 [L,QSA]
#Redirect static pages based on page name
RewriteRule ^pages/([^/]+)/?$ index.php?StaticPage&PageName=$1 [L,QSA]
# Rewrite subpages of the home page
RewriteRule ^page-([0-9]+)/?$ index.php?Page=$1 [L]
# Rewrite Post details pages
RewriteRule ^.*-p([0-9]+)/?$ index.php?PostId=$1 [L]
</IfModule>
# Set the default 500 page for Apache errors
ErrorDocument 500 /rswebtek_blog/500.php
#Set the defualt 404 error page
ErrorDocument 404 /rswebtek_blog/404.php
here is my link.php file:-
<?php
class Link{
public static function Build($link, $type='http'){
$base = (($type == 'http' || USE_SSL == 'no') ? 'http://' :'https://').getenv('SERVER_NAME');
//if HTTP_SERVER_PORT is defined and different than default
if(defined('HTTP_SERVER_PORT') && HTTP_SERVER_PORT !='80' && strpos($base, 'https') === false){
//append server port
$base .=':' . HTTP_SERVER_PORT;
}
$link = $base . VIRTUAL_LOCATION . $link;
//escape html
return htmlspecialchars($link, ENT_QUOTES);
}
public static function ToCategory($categoryId, $page =1){
$link = self::CleanUrlText(Blog::GetPostCategoryName($categoryId)).
'-c'.$categoryId.'/';
//$link ='index.php?CategoryId='.$categoryId;
if($page > 1)
$link .='page-'.$page.'/';
//$link .= '&Page='.$page;
return self::Build($link);
}
public static function ToPost($postId){
$link = self::CleanUrlText(Blog::GetPostTitle($postId)).
'-p'.$postId.'/';
// return self::Build('index.php?PostId='.$postId);
return self::Build($link);
}
public static function ToIndex($page = 1){
$link ='';
if($page > 1)
$link .='page-'.$page.'/';
//$link .='index.php?Page='.$page;
return self::Build($link);
}
public static function QueryStringToArray($queryString){
$result = array();
if($queryString !=''){
$elements =explode('&',$queryString);
foreach($elements as $key => $value){
$element = explode('=',$value);
$result[urldecode($element[0])] = isset($element[1]) ? urldecode($element[1]) : '' ;
}
}
return $result;
}
// Prepares a string to be included in an URL
public static function CleanUrlText($string)
{
// Remove all characters that aren't a-z, 0-9, dash, underscore or space
$not_acceptable_characters_regex = '#[^-a-zA-Z0-9_ ]#';
$string = preg_replace($not_acceptable_characters_regex, '', $string);
// Remove all leading and trailing spaces
$string = trim($string);
// Change all dashes, underscores and spaces to dashes
$string = preg_replace('#[-_ ]+#', '-', $string);
// Return the modified string
return strtolower($string);
}
//redirects to proper url if not already there
public static function CheckRequest(){
$proper_url = '';
if (isset ($_GET['Search']) || isset($_GET['SearchResults']) || isset($_GET['TagSearchResults']) || isset($_GET['StaticPage'])){
return;
}
// Obtain proper URL for category pages
elseif (isset ($_GET['CategoryId'])){
if (isset ($_GET['Page']))
$proper_url = self::ToCategory($_GET['CategoryId'], $_GET['Page']);
else
$proper_url = self::ToCategory($_GET['CategoryId']);
}
// Obtain proper URL for post pages
elseif (isset ($_GET['PostId'])){
$proper_url = self::ToPost($_GET['PostId']);
}
// Obtain proper URL for the home page
else{
if (isset($_GET['Page']))
$proper_url = self::ToIndex($_GET['Page']);
else
$proper_url = self::ToIndex();
}
/* Remove the virtual location from the requested URL
so we can compare paths */
$requested_url = self::Build(str_replace(VIRTUAL_LOCATION, '',$_SERVER['REQUEST_URI']));
//404 redirect if the requested product, category or department
//donnot exist
if(strstr($proper_url, '/-')){
//clean output buffer
ob_clean();
//load the 404 page
include('404.php');
//clear the output buffer an stop executon
flush();
ob_flush();
ob_end_clean();
exit();
}
// 301 redirect to the proper URL if necessary
if ($requested_url != $proper_url){
// Clean output buffer
ob_clean();
// Redirect 301
header('HTTP/1.1 301 Moved Permanently');
header('Location:'.$proper_url);
// Clear the output buffer and stop execution
flush();
ob_flush();
ob_end_clean();
exit();
}
}
//create link to the search page
public static function ToSearch(){
return self::Build('index.php?Search');
}
public static function ToSearchResults($searchString, $page = 1){
$link = 'search-results/find';
if(empty($searchString))
$link .='/';
else
$link .= '-' . self::CleanUrlText($searchString) . '/';
// $link .='all-words-'.$allWords.'/';
if($page > 1)
$link .= 'page-'.$page.'/';
return self::Build($link);
}
//build tag links
public static function ToTagLinks($tags, $page = 1){
$tags = explode(',', $tags);
foreach ($tags as &$tag) {
$link ='tagged/'.self::CleanUrlText($tag) ;
if($page > 1)
$link .='/page-'.$page.'/';
$tag = '<a class="taglist" href="'.self::Build($link).'" title="">'.$tag.'</a>';
}
return implode(', ', $tags);
}
public static function ToStaticPage($pageName){
//$link ='index.php?StaticPage&PageName='.$pageName;
$link ='pages/'.self::CleanUrlText($pageName) ;
return self::Build($link);
}
public static function ToTagNexPreLink($tag, $page = 1){
$link ='tagged/'.self::CleanUrlText($tag) ;
if($page > 1)
$link .='/page-'.$page.'/';
return self::Build($link);
}
?>
and index.php
<?php
//active session
session_start();
//start output buffer
ob_start();
//include utility files
require_once('include/config.php');
require_once(BUSINESS_DIR.'error_handler.php');
//set error handler
ErrorHandler::SetHandler();
// Load the database handler
require_once BUSINESS_DIR . 'database_handler.php';
// Load Business Tier
require_once BUSINESS_DIR . 'blog.php';
//Link::CheckRequest();
// Load presentation Tier
require_once(PRESENTATION_DIR.'application.php');
require_once(PRESENTATION_DIR.'link.php');
Link::CheckRequest();
$application = new Application();
//this is used to mute errors
$application->muteExpectedErrors();
//display page
$application->display('blog_front.tpl');
// close the connection
DatabaseHandler::Close();
//output content from the buffer
flush();
ob_flush();
ob_end_clean();
?>
problem arised when I select a category or post :- my static link as follow
http://www.rswebtek.in/database-c3/
any help must be appreciated

Clean URL on localhost

I'm trying to achieve clean URLs on my localhost (so when I write localhost/contact, it redirects me to localhost/contact.php), but it's not working. I did it according to the older tutorial I found on YouTube, but I probably didn't understand well some parts. Many thanks for every answer. Here is my code:
.htaccess // I am sure I have mod_rewrite allowed.
<IfModule mod_rewrite.so>
RewriteEngine On
RewriteBase /www/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
</IfModule>
Script in index.php
include_once('classes/simpleUrl.php');
$url = new simpleUrl('localhost');
$test = $url->segment(1);
if (!$url->segment(1)) {
$page = 'home';
}
else {
$page = $url->segment(1);
}
switch ($page) {
case 'home' :
echo 'Home page';
break;
case 'contact':
echo 'Contacts page';
break;
default:
echo '404';
break;
}
classes/simpleUrl.php
class simpleUrl {
var $site_path;
function __toString() {
return $this->site_path;
}
private function removeSlash($string) {
if ($string[strlen($string) - 1] == '/') {
$string = rtrim($string, '/');
return $string;
}
}
function __construct($site_path) {
$this->site_path = $this->removeSlash($site_path);
}
function segment($segment) {
$url = str_replace($this->site_path, '', $_SERVER['REQUEST_URI']);
$url = explode('/', $url);
if(isset($url[$segment])) {return $url[$segment];} else {return false;}
return $url;
}
$url = new simpleUrl('localhost');
localhost is not shown in $_SERVER['REQUEST_URI'] so in this case you may simply use $url = new simpleUrl('index.php');
OR
Use this code for .htaccess :
RewriteEngine On
RewriteBase /www/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php [L]
because when you do this:
RewriteRule ^(.*)$ index.php/$1
Your actual URL may become something like this:
localhost/index.php/contact
So it's better requested URL to stay same.
but in this case use:
$url = new simpleUrl('');
Oho, look at this mistery:
private function removeSlash($string) {
if ($string[strlen($string) - 1] == '/') {
$string = rtrim($string, '/');
return $string;
}
}
when passed $string does not ends with slash it returns nothing, so have to change it in such:
private function removeSlash($string) {
if ($string[strlen($string) - 1] == '/') {
$string = rtrim($string, '/');
}
return $string;
}
Now I'll explain when and why to use $site_path for simpleUrl constructor:
if you have running your script in subdirectory, for ex: if you are working under /www/test/ then you should you test as param to pass to simpleUrl constructor, otherwise leave it blank
Update 3
You should change simpleUrls segment method to this:
function segment($segment) {
$url = trim(str_replace($this->site_path, '', $_SERVER['REQUEST_URI']),'/');
$url = explode('/', $url);
if(isset($url[$segment])) {return $url[$segment];} else {return false;}
return $url;
}
and next use 0 as index instead of 1 - $url->segment(0)
I'm not sure if you wish to use more variables like: www.domain.com/folder-with-website/products/product-name or if you could live with: www.domain.com/folder-with-website/products?id=123
But try this:
index.php
<?php
$page = $_GET["page"];
if(file_exists("pages/{$page}.php")) {
include("pages/{$page}.php");
} else if(empty($page)) {
include("pages/home.php");
} else {
echo "This page does not exists";
}
?>
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1
Options -Indexes
Link setup
<ul>
<li>
Home <!-- Just a page without any variables -->
</li><li>
Products <!-- same as Home -->
</li><li>
Details about product <!-- Page with a variable / extra information -->
</li><li>
Details about product <!-- Page with more variables -->
</li>
</ul>

Mod_Rewrite PHP issue

I have actually tried the tutorial stated in here: http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls
I have tried to use the PHP version of the Tutorial. However it doesn't seems to work. In fact it looks a little bit illogical for me.
This is the code which I'd need to place to the .htaccess file:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^.*$ ./index.php
As I have tested this actually redirects everything to the index.php file. So I have inserted this code to my index.php file:
$request = $_SERVER['REQUEST_URI'];
$params = split("/", $request);
$safe_pages = array("login");
if(in_array($params[0], $safe_pages)) {
echo 'ok'; //insert a file here
} else {
echo 'not ok'; //header to 403.php
}
This code is quite starightforward. If the URI is /login it should echo: "ok" (insert the file there).
However whenever I type: mywebsite.com/login it just always gives me the index.php, with the message: "not ok" so something should be wrong with the php code I guess.
Your are missing one more method on the .htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
This should suport url like 'page/item'
<?php
$request = $_SERVER['QUERY_STRING'];
$params = explode("/", $request);
$safe_pages = array("login");
if(in_array($params[0], $safe_pages)) {
echo 'ok'; //insert a file here
} else {
echo 'not ok'; //header to 403.php
}
?>
This dont work with url like 'page/item'
This should work:
<?php
$request = $_SERVER['REQUEST_URI'];
$params = explode("/", $request);
$safe_pages = array("login");
$last_item = count($params)-1;
if(in_array($params[$last_item], $safe_pages)) {
echo 'ok'; //insert a file here
} else {
echo 'not ok'; //header to 403.php
}
You are testing the wrong item. You should check for the string 'login' in the end of the array. And the function split is depreciated, use explode()

Use PHP to rewrite URLS?

I want to make my own url rewriting rules using couple of PHP-MySQL. The concept is to have a rule in my .htaccess that send all request to my index.php file like :
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php
RewriteCond %{REQUEST_URI} !\.(.+)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301].
And php will take all params via a super global var like $_SERVER['REQUEST_URI'] and explode("/", $_SERVER['REQUEST_URI']).
function rewrite(){
$paramKeys = array("", "locale", "page", "par1", "par2", "par3", "par4", "par5");
$paramValues = explode("/", $_SERVER['REQUEST_URI']);
foreach($paramValues as $key => $value){
if (!is_array($key)) {
$paramValues[$key] = htmlspecialchars(stripslashes(trim($value)));
if($key == 0){ //but the 1st slash is in the end of URL
continue;
}
elseif($key == sizeof($paramKeys)){
break;
}
else $params[$paramKeys[$key]] = $value;
}
else continue;
}
return $params;
}
And compare the requested URL with URL's in my database to send http statut in order of the requested file is found 200, moved 301, or not found 404.
Have I a bad idea ? if not, how can I perfectionize it. Thank you !

Categories