开发者

URL on apache server does not default to the .php file after / has been added

Generally a url that looks like this: http://www.domain.com/product.php/12/

will open up product.php and serve the /12/ as request parameters, which then my PHP script can process to pull out the right product info. However when I migrated this whole site, after developing开发者_运维技巧 it, to a new server, I get a 404 error, because on that server it's not defaulting to the mother directory/file in case of an absence of requested directories.

I vaguely remember learning that this is generally a common apache function but I can't seem to recall how to set it up or how to manipulate it.. if there's an .htaccess method to achieve this that would be great.


What you're referring to is mod_rewrite. The official docs for it are here: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

You would configure it either in your VHost definition (recommended) or in an .htaccess file.

Assuming that you want to map all requests to a resource that Apache cannot serve (such as files that don't exist) to products.php you can use the following:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ /products.php?request=$1 [NC,L]

You can then use $_GET['request'] to get the path requested and take it from there, depending on what you want to do. I'd normally recommend letting mod_rewrite handle parsing the request and passing the proper attributes to your PHP, but if you're not familiar with mod_rewrite it's probably easier to do it in your PHP.


you can use mod rewrite engine to map this to

http://www.domain.com/product.php?arg=12

Mod rewrite details: http://forum.modrewrite.com

Sample:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^files/([^/]+)/(.+) files.php?app=$1&file=$2 [NC]

this rewrite rule will map any request containing files/firstrPart/secondpart to the script files.php

everything between the first and second slash after files will be passed as parameter app and the rest as file

Basicly you define a regex with some subpaterns and state which script should really be called.

You cna refer to the subpatterns with $n where n is the 1 based index of the pattern.

Have fun.

NOTE this is a extreme simplification of mod rewrite. Please do some research before you use it because this might go terribly wrong...


The directive you're looking for is "AcceptPathInfo on". mod_negotiations MultiViews feature would also give you the option of not including the ".php" which is another common one people abuse mod_rewrite to do.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜