Mod Rewrite - hide .php, hide optional querystring - mod-rewrite

I figured out how to hide .php, but I need to hide any query string on the URL, and provide for there not being one.
Here's my current rule: RewriteRule ^/?([a-z]+)$ $1.php
I've searched everywhere, to no avail.

Lets say you have a page that displays items from some kind of a lookup. So the requested resource is www.example.com/page.php?display=news.
In this case you can use something like RewriteRule ^/news/$ page.php?display=news This way you can create friendly URLs for different resources which might need a query string value passed in.
Lets say you want to make this generic. So display can have values news, about, company which map to the urls /news/ /about/ /company/ then you simply change your rule to
RewriteRule ^/([^/]+)/?$ page.php?display=$1
You can also use this second method to say change your shopping cart system's URLs to a friendly one. Say your shopping cart uses a query string like - shop.php?category=1&product=10. You can convert this into a URL like shop/category/1/product/10. The rule would be
RewriteRule ^shop/category/([^/]+)/product/([^/]+)$ shop.php?category=$1&product=$2

Related

Rewriting url with the following regular expression

I'm trying to do a mod rewrite to get this url: localhost/test/index.php?hello
I created a file for this page called hello.php and it is in the folder /test
To clarify, I have another page that has a link to my hello.php, but what is the correct url so I can display localhost/test/index.php?hello in the url when I click the link to access my hello.php page.
The following doesn't seem like it is right:
RewriteRule ^.*$ index.php?$1 [L]
Try this if you want to just do php files.
RewriteEngine on
RewriteRule (.*)\.php$ /index.php?$1 [L]
To clarify what my answer does. It gives you more friendly URLs which it sounded like what your were asking for.
So you can use localhost/hello.php and it will be internally redirect to /localhost/index.php?hello. Internally means they will never see localhost/index.php?hello and will always see localhost/hello.php in their browser.
You can do any URL and it will rewrite to a php file. e.g. localhost/index.php?newpage and you can use /localhost/newpage.php
Hope that is clearer.
EDIT
You want the reverse but I don't know how your PHP is constructed but query strings are typically field/value pairs. For example name=john, page=contact, action=hello etc. You have index.php?hello but hello has no content or value.
That's probably why you're having such a hard time even re-writing your URL. Using $_GETwould require a value.
So what I would do, is if your URL was like this using field/value pairs
index.php?action=hello
Then in the index.php file you could do something like
$action = $_GET["action"];
if($action == "hello"){
//show contents of hello, include a page or whatever
}
Once you have good URLs it would be easy to rewrite it.
So if the URL that you want shown is like
index.php?action=hello and you want to redirect it to hello.php
Your .htaccess would look like this
RewriteRule ^action=([^/]+) /$1.php [R,L]
That would redirect it to the php file. If you don't want to show the redirection and keep it an internal redirect you can remove the R flag and just keep [L].
I personally don't want the user to see really long query strings URL example. mysite.com?page=music&artist=someartist&title=sometitle
So all my URL's are rewritten to be shorter and friendlier like my original answer.
you don't need .htaccess for 2. as far as you're using GET parametr - use it in index.php:
if (isset($_GET['hello'])) include('hello.php');
this will show the contents of hello.php inside index.php

Implement friendly URLs with product name

I'm currently working on an e-commerce site with the following URL format for individual products:
examplesite.com/shop.php?sec=prod&prod=373
Where 373 is an individual product number. I would like to rewrite all the product URLs so they look like this:
examplesite.com/product-name-here
Unfortunately, some of the product names contain characters such as *, / and !, which should not be included in the URL.
I have access to everything, but limited skills, so please just assume I'm completely naive if you answer!
THANKS!
Using only unique slugs ('product-name-here') could be tricky sometimes. It's better to have something like this:
examplesite.com/373/product-name-here.html // or
examplesite.com/373-product-name-here
... or any other combination, but keep the product ID in the url. To create slugs, google for PHP slug generator
If you're running your server with Apache, you need to load the mod_rewrite module and add an .htaccess to the root of your project (there where you execute the index.php)
RewriteEngine On
Options FollowSymLinks
# examplesite.com/373/product-name-here.html
RewriteRule ^([0-9]*)/([a-zA-Z0-9+-_\.])\.html$ shop.php?sec=prod&prod=$1

mod_rewrite take part of url and add it to the end of a second url

I am attempting to make it where faculty or students at my library that have a pmid number for PubMed, and want to share the link with others could do it by just remembering our url, and adding the pmid to the end of our url, with the identifier p.
This is where mod_rewrite comes in it would drop off the url: site.com/p/112233444 but keep 112233444 and then add it to the end of linkresolver.com/112233444
The rule that I have come up with is:
RewriteRule ^/p/(.*)$ linkresolver.com=$1
First, is this possible I control the library domain, but I am not in control of the second url that I am attempting to add the PMID to.
Second, this is my first attempt at mod_rewrite so if I am way let me know I have looked at Apache's documentation. I know it is really powerful complex tool, so my rewrite rule just seems off.
Any help would be greatl
Does this work?
RewriteRule ^p/(.*)$ http://linkresolver.com/$1 [R]

Help with mod_rewrite

I written some php code which generates the URL's of pages like article.php?id=1 etc.
Obviously id is the id of the article taken from database. In the same database table, I have id, title, and category columns.
such as:
id title category
1 hello world general
My question is that how can I rewrite the URL's using the title and category of the article instead of id. For example, I want to re-write URL
example.com/article.php?id=1
To:
example.com/general/hello-world
Thanks.
The simplest way to do that would be to have a php file named general.php and use the $_SERVER['PATH_INFO'] variable.
I suppose you're going to use an incoming rewrite rule.
One way would be to extract the category and title from the URL and use another PHP file to find the article
RewriteRule .*?\.php - [PT]
RewriteRule (.*?)/(.*) articleByCategoryAndTitle.php?category=$1&title=$2
A second approach might be to use all three parts like in
example.com/category/title-42
and then use a RewriteRule to open the article page by ID
RewriteRule (?:.*)-(\d+)$ article.php?id=$1

Mod_rewrite and MySql

I have a url eg. www.example.com/user.php?user_id=9 , where the user_id field maps to one of the pk in the user table . I don't want the url to be like this , instead i want to have a url like www.example.com/user/Aditya-Shukla.i am using apache 2 and I understand that mod-rewrite module has sets of rewriting rules which can be used to create url alias.
My question is
I have all href in the form www.example.com/user.php?user_id=9. So to change the url I suppose i have to change all the href's to the www.example.com/user/Aditya-Shukla and for rewriting the rule do a query to get a record?
Is there a better solution .
No, mod_rewrite does not have sets of rewriting rules. It rather provides directives to build rules based on regular expression patterns that can be combined with additional conditions.
In your case you would build a rule that takes any requested URL path that starts with /user/ and has another path segment following and rewrites it internally to your user.php, like:
RewriteEngine on
RewriteRule ^/user/([^/]+)$ /user.php?name=$1
The first directive RewriteEngine on is just to enable mod_rewrite. And the second directive RewriteRule … is the rule as described above: ^/user/([^/]+)$ is the pattern that matches any URL path that starts with /user/ (i.e. ^/user/) and that is followed by one path segment (i.e. ([^/]+)$). That request is then rewritten internally to /user.php while the matched path segment behind the /user/ is used as a parameter value for the name parameter ($1 is a reference to the matched value of the first group denoted with (…)).
So this will rewrite a request of /user/Aditya-Shukla internally to /user.php?name=Aditya-Shukla. You can then use that user name and look it up in your table.
You can either add a RewriteRule that will rewrite user/Aditya-Shukla to user.php?user_name=Aditya-Shukla and handle the rest in your code.
RewriteEngine On
RewriteRule ^user/(.*)$ user.php?user_name=$1
Or using a RewriteMap directive to lookup usernames, which will allow to rewrite user/Aditya-Shukla directly to user.php?user_id=9
I presume that within your own site you will always create the canonical form of the URL, i.e.:
/user/Aditya-Shukla
...and you are just having to deal with outside links that are not in canonical form, i.e. "old links" like:
www.example.com/user.php?user_id=9
mod_rewrite may not be suitable for remapping in this situation. I am presuming you may have very many users, and that number may grow. mod_rewrite does have a RewriteMap directive and yes there are ways to generate your map dynamically, but I don't think that would be a good design (to dynamically create a map of userId-to-userName dynamically every time your rewrite rule matches...)
Instead you should simply write your user.php code to lookup the correct userName, assemble the canonical form of URL you want, and send a redirect back to the client. Something like:
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com/user/Aditya-Shukla" );
You should probably also use a 301 redirect (instead of 302) to indicate this is a "permanent" URL change, which will help search bots index your site correctly if it encounters an "old style" URL out there.
-broc

Resources