user3113607
user3113607

Reputation: 82

htaccess similar cases like Facebook or Twitter issue

I have this piece of line in my htaccess that causes errors. I couldn't find a similar answer to my inadequate wording.

I am attempting to get "username/followers, username/following, etc" and also "settings/account, settings/password, etc". I stopped using sub folders for non-scripts and images, so everything is on the same level.

Now I know they have similar casing, but I am curious how Facebook, Twitter, etc manage to do this.

Do they condense to one large page to make it work? I know they prevent people from using settings and other root level names from being used, and I haven't quite gotten to that point myself.

RewriteRule ^([^/]+)$ profile_home.php?userdomain=$1 [L]
RewriteRule ^([^/]+)/([^/]+)$ profile_home.php?userdomain=$1&selection=$2 [L]
RewriteRule ^settings/$ profile_settings.php [L]
RewriteRule ^settings/([^/]+)$ profile_settings.php?selection=$1 [L]
RewriteRule ^settings/([^/]+)/([^/]+)$ profile_settings.php?selection=$1&upload=$2 [L]

If I remove

RewriteRule ^([^/]+)/([^/]+)$ profile_home.php?userdomain=$1&selection=$2 [L]

Then everything works fine. How do I make this work with two pages?

I could do

RewriteRule ^settings/([^/]+)/$ profile_settings.php?selection=$1 [L]

But it doesn't look as nice. If not right place to ask, please let me know.

Upvotes: 1

Views: 81

Answers (2)

chris85
chris85

Reputation: 23880

Your second rule matches both directory structures. You can use a negative lookahead so requests starting with the setting are not matched by that rule.

^(?!settings)([^/]+)/([^/]+)$

You can read more about lookaheads here:

  1. http://www.rexegg.com/regex-lookarounds.html
  2. http://www.regular-expressions.info/lookaround.html

Upvotes: 1

Otávio Barreto
Otávio Barreto

Reputation: 1568

Here is my solution

RewriteEngine On

# make sure to add your document root dir
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([\w-.]+)/?$ index.php?id=$1 [L,QSA]

RewriteCond %{DOCUMENT_ROOT}/htdocs/user/$2 -f
RewriteRule ^([\w-]+)/(.+)/?$ $2?id=$1&goto=$2 [L,QSA]

RewriteCond %{DOCUMENT_ROOT}/htdocs/user/$2/index.php -f
RewriteRule ^([\w-.]+)/([a-z0-9]+)/?$ $2/index.php?id=$1&goto=$2 [NC,L,QSA]

RewriteRule ^([\w-.]+)/([a-z0-9]+)/?$ index.php?id=$1&goto=$2 [NC,L,QSA]

so inside your server root dir htdocs/user/ you must have a folder like /user/ and a file index.php this htacess will replace the file site/user/index.php to site/user/username in the same user dir you need to have the following.php file so site/user/username/following.php in the same folder, I think you understand my answer.

Upvotes: 1

Related Questions