Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I've got a site that was hosted on a linux el cheapo hosting service that I'm migrating to my Mac OS X 10.5 Leopard Server server running Apache 2.2.8 & PHP 5.2.5 w/rewrite_module enabled and AllowOverride All, but I'm running into an issue with the following lines in the .htaccess file:

RewriteEngine On
#RewriteRule ^view/([^/\.]+)/?$ /view.php?item=$1 [L]
#RewriteRule ^order/([^/\.]+)/?$ /order.php?item=$1 [L]
RewriteRule ^category/([^/\.]+)/?$ /category.php?category=$1 [L]

As you can see, I've commented out the RewriteRule directives for /view/ and /order/, so I'm only dealing with /category/. When I attempt to load http://domain.tld/category/2/ it runs category.php (I've added debug code to confirm), but $_SERVER['REQUEST_URI'] comes through as /category/2/ and $_GET['category'] comes through as empty.

I'm usually fine with troubleshooting .htaccess files and mod_rewrite directives, but this one's got me stumped for some reason.

Update: I followed Josh's suggestion and here's the what's dumped to mod_rewrite.log when I try to access http://domain.tld/category/2/:

65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (2) init rewrite engine with requested uri /category/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) applying pattern '.*' to uri '/category/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (1) pass through /category/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] add path info postfix: /Library/WebServer/Documents/tld.domain.www/category.php -> /Library/WebServer/Documents/tld.domain.www/category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/category.php/13 -> category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri 'category.php/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6aa98/subreq] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/category.php
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] add path info postfix: /Library/WebServer/Documents/tld.domain.www/category.php -> /Library/WebServer/Documents/tld.domain.www/category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/category.php/13 -> category.php/13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri 'category.php/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b5ea98/initial] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/category.php
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (2) init rewrite engine with requested uri /13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) applying pattern '.*' to uri '/13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (1) pass through /13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] strip per-dir prefix: /Library/WebServer/Documents/tld.domain.www/13 -> 13
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (3) [perdir /Library/WebServer/Documents/tld.domain.www/] applying pattern '^category/([^/\.]+)/?$' to uri '13'
65.19.81.253 - - [22/Oct/2009:17:31:53 --0400] [domain.tld/sid#100aae0b0][rid#100b6ea98/subreq] (1) [perdir /Library/WebServer/Documents/tld.domain.www/] pass through /Library/WebServer/Documents/tld.domain.www/13
share|improve this question
add comment

3 Answers

up vote 6 down vote accepted

just add this to your .htaccess file

Options -MultiViews

i've had the same problem for hours

i don't know why, but it's turned on by default on OSX

it produces your error because when you try loading category/ it finds the category.php and redirects everything after the slash to that file

share|improve this answer
add comment

Do you have access to httpd.conf? If so please add to httpd.conf:

RewriteLog "/tmp/mod_rewrite.log" 
RewriteLogLevel 3

And post what that log says when you load /category/2. Remove this after you get the information you need from it -- it's very wasteful of server resources.

EDIT:

Thanks for the log. Something is rewriting the URL to: /category.php/13. Any other RewriteRules? Are you using FastCGI? What if you rename category.php to something else, like Category.php or display_category.php?

EDIT2:

Since something seems to be rewriting /category/(.*) to /category/$1, and we don't know what it is, why don't you change:

RewriteRule ^category/([^/\.]+)/?$ /category.php?category=$1 [L]

to:

RewriteRule ^category.php/([^/\.]+)/?$ /category.php?category=$1 [L]

and see if that works?

share|improve this answer
    
Done. See updated question. –  morgant Oct 22 '09 at 21:43
    
Thanks! See edited answer. –  Josh Oct 22 '09 at 21:44
    
No other rules. In fact, I fully deleted all but RewriteEngine On and RewriteRule ^category/([^/\.]+)/?$ /category.php?category=$1 [L] from the .htaccess file. Renaming category.php to display_category.php and changing the substitution to /display_category.php?category=$1 worked, but I'd really like it to work with the file still named category.php. –  morgant Oct 22 '09 at 21:54
1  
Something is rewriting requests for /category/(.*) to /category.php/$1... Do you use FastCGI PHP? –  Josh Oct 22 '09 at 22:05
1  
Hm. Well without seeing all of httpd.conf I'm not sure what's rewriting the requests to /category.php/$1 but I'm glad it's working now! I suspect that something sees a PHP script with that basename and rewrites. (That's why I suspected FastCGI PHP). Do the same rewrite change for /view and /order and you should be set. –  Josh Oct 22 '09 at 22:40
show 3 more comments

I'm probably being an idiot here, but isn't that the expected behavior? Mod_rewrite changes the URL inline for finding the file, the environment variables seen by PHP don't normally change.

I think you have to parse the REQUEST_URI string to pull out the category variable.

Mark

share|improve this answer
    
$_GET isn't an environment variable -- it's a superglobal containing the result of query strings. What he's trying to do should work. –  Josh Oct 22 '09 at 21:11
    
Hmm, I thought that because RewriteRule ^category/([^/\.]+)/?$ /category.php?category=$1 [L] included the substitution string /category.php?category=$1 that it would outright replace the URI, even for internal redirects. [httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule] notes that "The URL is completely replaced by the Substitution and the rewriting process continues until all rules have been applied, or it is explicitly terminated by a L flag." Also, if I change the flag to [R,L] it exhibits the same behavior and doesn't redirect. –  morgant Oct 22 '09 at 21:16
    
It should be working as you originally expected, although the [R] flag not taking effect is unusual. Can you enable the rewrite debug log? –  Josh Oct 22 '09 at 21:19
    
@mfarver You are correct that $_SERVER['REQUEST_URI'] comes through as /category/2/ even after it's fixed, but the question was really about the rewrite not working and so $_GET['category'] coming through blank. –  morgant Oct 23 '09 at 0:25
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.