开发者

Hiding URL key parameters with .htaccess

I've been searching all over the web and haven't yet found any solution to this issue. I'm hoping you could shed some light on the situation.

I have my index file set up like this:

<header></header>
<div id="main">
    <?php
    if(isset($_GET["p"])) $p = $_GET["p"];
    else $p = "home";

    if(file_exists("pages/{$p}.php")) include("pages/{$p}.php");
    ?>
</div>

which makes me load my pages with a ?p=contact href.

Say I would like to displ开发者_运维问答ay a users profile. I'd then create a subfolder in my "pages" folder, making the relative path pages/users/profile.php, thus the href ?p=users/profile&uid=5. But that leaves an ugly URL (as well as SEO rating).

How would I rewrite that URL to look like /users/profile/5?


EDIT: I've tried the following, resulting in HTTP 500:

RewriteRule ^([^/]*)/([^/]*)$ /?p=$1&uid=$2 [L]

EDIT: My .htaccess file, located directly inside root folder: http://pastie.org/2268239

Line 338 is where I want to achieve this (currently just a comment).


Simplest answer for both your situations would be to add this in your .htaccess file

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php?$1 [L]

This will redirect all traffic on your domain to your index.php file.

You could then determine what to do in your script using the uri in $_SERVER["REQUEST_URI"]


I achieved the desired effect by adding these three lines:

RewriteRule ^([a-zA-Z]+)$ index.php?p=$1 [L]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?p=$1/$2 [L]
RewriteRule ^([a-zA-Z]+)/([0-9]+)$ index.php?p=$1&uid=$2 [L]

This allows me to access /contact, /users/index and /users/profile/5.


I'm not a php guy, but I tried this with my rewrite.

RewriteRule ^/(.+)/([^/]+)$ /index.php?p=$1&uid=$2 [L]

In this case, for the p parameter, you're looking for all chars up to the last slash, so the first part of this takes anything, otherwise it's going to stop at the first slash (users instead of users/profile).

Then it looks for a slash and keep (not-slash). The (.+) will be greedy, so it will go up to the last slash before the end.

Then it occurred to me the last part doesn't need to avoid slashes. Since the first part is greedy, the explicit / slash is going to BE the last slash. So it's even simpler:

RewriteRule ^/(.+)/(.+)$ /index.php?p=$1&uid=$2 [L]

I like the .+ to require something, at least when first figuring these out. If later you know they can be optional, you can do .*, but usually that ends up being a different page or a different rule.

These rules do expect all urls to be in this format, which is what you're asking. But maybe it's a little too grabby, so it could exclude urls that really have a .htm or .php or whatever.

RewriteRule ^/(.+)/([^.]+)$ /index.php?p=$1&uid=$2 [L]

This looks for anything up to the last slash, then anything without a dot in it. If it has a dot, this won't apply. So if it's a "regular" url, this will leave it alone. This might help with the 404 problem, in case the 404 page is getting caught by this.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜