I see a lot of this question, but I couldn't solve the issue.
I suspecting that it doesn't read the right segment as I have a reroute config and htaccess to remove the index page.
The code is throwing a 404 page.
Here is my Model:
public function get_city_reviews($city_id,$limit,$offset) {
$list = array();
$this->db->from('biz');
$this->db->where('city_id',$city_id);
$this->db->order_by('created_at','desc');
$this->db->limit($limit,$offset);
$query = $this->db->get();
foreach($query->result() as $row) {
$list[] = $row;
}
return $list;
}
My Controller:
$slug = $this->uri->segment(1,'');
if($slug)
{
$this->load->model('catsAndCities','cc');
$this->cc->set_table_name('city');
$city = $this->cc->get($slug,'slug');
if(!$city || $city->parent_id != 0)
{
show_404();
}
else
{
$this->tank_auth->set_user_city($city);
}
}
else
{
$city = $this->tank_auth->get_user_city();
}
$this->load->library('pagination');
$config = array();
$base_url ="local/index/";
$config["base_url"] = site_url().$base_url;
$config["total_rows"] = $this->bizs->record_count();
$config["per_page"] = 5;
$config["uri_segment"] = 4;
$config['full_tag_open'] = '<p class="pageBar">';
$config['full_tag_close'] = '</p>';
$config['num_links'] =2;
$config['anchor_class'] = 'class="page-num" ';
$this->pagination->initialize($config);
$page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
$data["results"] = $this->bizs->get_city_reviews($city->id,$config["per_page"],
$page);
$data["pagination_links"] = $this->pagination->create_links();
$data['reviews'] = $data["results"];
$this->load->view('local/index',$data);
My View:
<div id="pagination-container">
<div class="pagination">
<ul>
<?=$pagination_links?>
</ul>
</div>
This is my Routes:
$route['default_controller'] = "local/city";
$route['[0-9a-zA-Z\-_]+'] = "local/city";
$route['scaffolding_trigger'] = "";
This is my htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php/$1 [L]
#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
As i suspected, you are telling CI to find 404 page if no city is found. Try commenting this : Or find a way to work around it.
if(!$city || $city->parent_id != 0)
{
show_404();
}
else
{
$this->tank_auth->set_user_city($city);
}
Then change
$base_url ="local/index/";
to
$base_url ="";
And your segment to 1
$config["uri_segment"] = 1;
That should do it.
Try changing the base_url to "local/city", and the uri_segment changed to 3.
Related
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.";
}
I enabled the.Htaccess Apache feature. For my localhost wamp it works, because ErrorDocument 404 effect,but it seems only RewriteRule doesn't effect,Is there a problem I have written??And how to write the statement that be Annotated?Thanks a lot!
These urls are not working:
RewriteCond %{HTTP_HOST} !^www.163.com [NC]
RewriteRule ^/(.*)$ http://www.163.com/ [L]
1.RewriteRule ^http://localhost/app/track/([0-9]+)$ /index.php?app=$1
2.RewriteRule ^http://localhost/app/track/123$ /index.php?app=123
For:
RewriteRule ^localhost/app/track/([0-9]+)$ /index.php?app=$1
RewriteRule ^localhost/app/track/123$ /index.php?app=123
Delete the 'localhost/' and it works well.
I think The regexp Pattern doesn't match because my DocumentRoot with '/'.
/////
To help understand,I wrote the pseudo-code by php,reference,welcome corrections :)
$realPath = str_replace('http://localhost',DocumentRoot,$url);
redirect(test($realPath));
function test($realPath) {
$pass = false;
if(preg_match($argRegExp, str_replace(DocumentRoot, '', $realPath))) {
if(strpos($argRewriteUrl,'?') ===false){
$realPath = $argRewriteUrl.'/'.basename($realPath);
$pass = $realPath;
}else{
getArgs($realPath);//split ?xx=xx&...
}
if($realPath) {
if($r = test($realPath)){
$pass = $r;
}
}
}
if($pass) {
if($r = test($realPath)){
$pass = $r;
}
}
return $pass;
}
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>
I have been struggling for months now, and I'm just not getting it. I'm trying to get clean urls with php on xampp, I either get server error 500 or www.something.com/root/index.php?page=whatever does not go away I want www.someting.com/page/queryresult/
Can anyone help?
I think the problem is linking the menu to the query and the sticky part is in the switch
function display_menus_new()
{
$sql = "SELECT * FROM menus";
$query = mysql_query($sql) or die(mysql_error());
$array = array();
if (mysql_num_rows($query)){
while($rows = mysql_fetch_array($query)){
$array[$rows['parent_id']][] = $rows;
}
loop_array($array);
}
}
function loop_array($array = array(), $parent_id = 0)
{
if(!empty($array[$parent_id])) {
echo '<ul>';
foreach($array[$parent_id] as $items){
echo '<li>';
switch($items['name']){
case 'Home': print_r('<a href="home.php" >'.($items['name']).'</a>');
$items = str_replace("name", "", "");
case 'About': print_r('<a href="about.php" >'.($items['name']).'</a>');
$items = str_replace("name", "", "");
case 'Services': print_r('<a href="services.php" >'.($items['name']).'</a>');
$items = str_replace("name", "", "");
case 'Contact': print_r('<a href="contact.php" >'.($items['name']).'</a>');
$items = str_replace("name", "", ""); }
//This part Connects the menu to the Database Query Where ?Page= the Data Value connection
print_r('<a href="?Page='.($items['name']).'" >');
echo $items['name'];
loop_array($array, $items['Cat']);
echo '</a></li>';
}
echo '</ul>';
}
}
i have xampp on windows;
.htaccess:
RewriteEngine On
# Run everything else but real files through parse.php
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} !^/dev-boards
# RewriteCond %{REQUEST_URI} !^/tests
#RewriteCond %{HTTP_HOST} !^(admin|admintemplate)\.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(css|png|html|js|json|jpg|jpeg)$
RewriteRule ^(.*)$ parse.php?info=$1 [L]
parse.php:
<?php
include("../connect.local.php");
session_start();
$getVars = $_GET['info'];
$vars = explode("/",$getVars);
//http://localhost/viewprofile/0/yes
//$vars[0] is "viewprofile"
//$vars[1] is 0
//$vars[2] is "yes"
What i do is i use file_exists to use $vars[0] and $vars[1] to reference a folder/file. if the file doesnt exist, route to $vars[0]/index.php
if the folder doesnt exists, redirect to index.php
Hope this helps to get you started.
add a file called .htaccess in your home directory
start the rewrite engine at the top of the file:
<IfModule mod_rewrite.c>
RewriteEngine On
In that file, you'll write some conditions for re-directing to a clean URL:
#first, we need to define the request, in this case, index.php?page=whatever
RewriteCond %{THE_REQUEST} /index.php?page=([0-9]*)
# now we need to make it look like it's just the clean url
RewriteRule ^$ /page/%1? [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9]+) /index.php?page=$1 [L]
This is a bit confusing, but basically what it means is that when your browser receives the ugly URL, it gets redirected to the pretty URL. Then, the re-write fills the pretty URL with the content from the ugly URL.
Close your if statement after you're done re-writing:
</IfModule>
I am trying/attempting to create my own MVC. I am really trying to manipulate the url. I am trying to get several parameters to form a full URL.
I want to turn
http://example.com/?action=account&user=JohnDoe
to
http://example.com/account/JohnDoe
But I cant seem to get the .htaccess file to work right :/
This is what I have
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([a-zA-Z0-9-=_?]+)/?$ index.php?action=$1&user=$2 [NC,L]
When I go to http://example.com/account/JohnDoe I get a 404 error.
Your missing one parameter, try this
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?action=$1&user=$2 [NC,L]
Rather than set up a mod_rewrite rule for that specific URL, why not put an entire framework in place?
mod_rewrite as follows:
#URI PATH CONSTRUCTION
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)$ /index.php?string=$1 [L,QSA]
</IfModule>
Then have your index.php file break up $_REQUEST['string'] into an array that you can test to direct the request to where it needs to go
if (isset($_GET['string'])) {
//DEALS WITH GET PARAMETERS
if (strstr($_GET['string'],"?") !== false) {
$pos = 0;
$tailstr = substr($_GET['string'],$pos);
$endpos = strpos($tailstr, "?");
$endpos = $endpos + strlen("?");
$string = substr($_GET['string'],$pos,$endpos);
} else {
$string = $_GET['string'];
}
$path = explode("/",$_GET['string']);
}
//Depth to 5 levels
for ($i=0;$i<5;$i++) {
if (!isset($path[$i])) $path[$i] = null;
}
global $path;
You now have a global array containing the individual elements in the URI
eg
http://example.com/account/JohnDoe
would give you:
$path[0] = 'account'
$path[1] = 'JohnDoe'
$path[2] = ''
$path[3] = ''
$path[4] = ''