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
link|improve this question

78% accept rate
feedback

4 Answers

up vote 5 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

link|improve this answer
feedback

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?

link|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
feedback

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

link|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
feedback

Need Help i ADD this code in the my .htaccess Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?magazinfengshui.ro [NC] RewriteRule (.) produs.php?=$1 RewriteRule (.) produse.php?cat=$1 but design not work why ?

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

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