?
Solved

htaccess rewrite for get variables

Posted on 2009-05-08
7
Medium Priority
?
1,391 Views
Last Modified: 2012-05-06
I see a lot posted on this but I am going crazy trying to get this to work on my site and I know it is simple.  I have a simple site at www.fostersolutionsinc.com.  I the attached code in my htaccess file (not including the two lines after the space).  It has worked fine to strip the .php and give me friendly links, but now I need to add a get variable.  

I thought that the rewrite rules would have worked to take "subdirectories" and create them as php get variables.  I added the two lines after the space as a way to specifically create the $client variable, but it doesn't seem to be working.  When I go to http://www.fostersolutionsinc.com/portfolio/hello, as a test, it shows up but without the css, or something.  I'm not sure what is going on.

What am I missing?
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} \.(js|gif|jpg|png|css|htm|html)$
RewriteRule ^(.*)$ $1
RewriteRule ^(index\.(html?¦php))?$ /index.php? [QSA,L]
RewriteRule ^([a-z0-9_-]+)\?(.*)$ /$1.php?$2
RewriteRule ^([a-z0-9_-]+)$ /$1.php
 
 
RewriteRule ^portfolio/?$ portfolio.php
RewriteRule ^portfolio/([-a-zA-Z0-9_]+)/?$ portfolio.php?client=$1 [QSA]

Open in new window

0
Comment
Question by:dougfosterNYC
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 27

Expert Comment

by:caterham_www
ID: 24337774
> RewriteRule ^(.*)$ $1

That doesn't make sense, it creates unnecessary overhead. Use the dash (no substitution) instead of a rewrite. And use the L flag, too. You won't need the cond. as well since you can check the extensions in the rule-pattern, which is being processed before your cond. is evaluated

> as a test, it shows up but without the css, or something.  I'm not sure what is going on.

your paths in your html source are wrong. If you use a folder structure, you must adjust your html references, too. Otherwise the browser will request resources from places where they aren't. A simple way would be to put a
<base href="http://example.com/" />
into your html <head> section or make sure the references are absolute, i.e. start with a leading slash (src="/foo.jpg" instad of src="foo.jpg").
RewriteEngine on
RewriteRule \.(js|gif|jpg|png|css|htm|html)$ - [L]
# what are you trying to achieve with this rule? Ereasing the queryString with a ? at the end plus qsa flag doesn't make sense.
# note that the queryString does not match the rule-pattern, it's passed on automatically to your substitution.
RewriteRule ^(index\.(html?&#166;php))?$ /index.php? [QSA,L]
RewriteRule ^portfolio/([-a-zA-Z0-9_]+)/?$ portfolio.php?client=$1 [QSA,L]
RewriteRule ^([a-z0-9_-]+)/?$ /$1.php [L]

Open in new window

0
 

Author Comment

by:dougfosterNYC
ID: 24338337
Hi caterham.

Well, clearly I  am not a unix person, so I'm only guessing here.  I changed my htaccess to what you put, and added the base href.  The base href did fix the problem of the links going to a non-existent subdirectory.

But it still isn't creating the client URL variable (see below).  I would think that if I go to http://www.fostersolutionsinc.com/portfolio/test, it would convert to  portfolio.php?client=test.  

		if (isset($_GET["client"]))
		{
			echo ($_GET["client"]);
		} else {
			echo "No client variable";
		}

Open in new window

0
 
LVL 27

Expert Comment

by:caterham_www
ID: 24338419
Do you have MultiViews enabled (may be in your server config)? In that case mod_negotiation will map portfolio/foo to portfolio.php prior mod_rewrite acts in per-directory context. You can disable MultiViews via

Options -MultiViews

if you're allowed to do so in .htaccess files.
0
Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

 

Author Comment

by:dougfosterNYC
ID: 24338727
I use a shared hosting environment.  When I added that line it blew up.

I am trying to get the host company to help me.  This seems more difficult than it should be....
0
 
LVL 27

Accepted Solution

by:
caterham_www earned 2000 total points
ID: 24338924
If multiViews are part of the problem, you cold try to reword the pattern/URI path you're requesting. E.g. request

/p/test

with
RewriteEngine on
RewriteRule \.(js|gif|jpg|png|css|htm|html)$ - [L]
# what are you trying to achieve with this rule? Ereasing the queryString with a ? at the end plus qsa flag doesn't make sense.
# note that the queryString does not match the rule-pattern, it's passed on automatically to your substitution.
RewriteRule ^(index\.(html?&#166;php))?$ /index.php? [QSA,L]
RewriteRule ^p/([-a-zA-Z0-9_]+)/?$ portfolio.php?client=$1 [QSA,L]
RewriteRule ^([a-z0-9_-]+)/?$ /$1.php [L]

Open in new window

0
 

Author Comment

by:dougfosterNYC
ID: 24339222
Ok, that did the trick.  I wish I knew exactly  what is going on, but it worked. I  actually changed the php file to portfoliolist.php, and then I could keep the directory /portfolio/test.

I guess the "directory" name conflicted with the php file name.  I'll award the points, but if you could give a quick explanation on what is going on, that woudl be great.

Thanks.
0
 
LVL 27

Expert Comment

by:caterham_www
ID: 24339593
> I guess the "directory" name conflicted with the php file name.

Exactly. There's a feature (MultiViews) which finds a corresponding file if you request the file without its extension. MultiViews has other features depending on the http accept headers as well (language detection to map foo.html to foo.html.en etc.)
0

Featured Post

Get free NFR key for Veeam Availability Suite 9.5

Veeam is happy to provide a free NFR license (1 year, 2 sockets) to all certified IT Pros. The license allows for the non-production use of Veeam Availability Suite v9.5 in your home lab, without any feature limitations. It works for both VMware and Hyper-V environments

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction As you’re probably aware the HTTP protocol offers basic / weak authentication, which in combination with the relevant configuration on your web server, provides the ability to password protect all or part of your host.  If you were not…
If you are a web developer, you would be aware of the <iframe> tag in HTML. The <iframe> stands for inline frame and is used to embed another document within the current HTML document. The embedded document could be even another website.
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Suggested Courses

719 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question