Mod_rewrite给用户自己的url,需要排除一些情况

时间:2011-02-05 13:08:41

标签: php .htaccess mod-rewrite

我正在建立一个小型的本地社交好社区网站,其中每个项目都有自己的网址,这样当用户名='foo'时,网址变为http://website.com/foo类似于Twitter。尽管我对htaccess没有经验,但我已经设法让它在很大程度上发挥作用。但是当有人输入http://website.com/subdomain/foo时,我现在遇到了问题。现在这也试图找到用户名并显示页面,但我不希望它工作,并希望向他们显示我们的404页面。

此外,在某些子域(即约)上,我们还有其他页面,例如'ourstory.php'。我真的很想显示'about / ourstory'而不是/ ourstory.php,但仅限于选定的子域名。

最后,当具有'website.com/subdomain/subdomain'结构时,即使使用绝对路径,它也会在需要其他php文件时生成内部服务器错误。

这是我当前的mod_rewrite,我希望你能理解我尝试做的事情并随意优化,我可能已经犯了一些初学者的错误。

这个mod重写做了三件事:
1.删​​除地址前面的“www”;
2.第二个确保当他们只是键入主页时,它会将它们带到主页(删除它,由于某种原因会导致空主页,这可以用另一种方式完成吗?);
3.当键入的名称不是子域时,它会将它们重定向到配置文件页面并使URL成为用户名。

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteCond %{REQUEST_URI} !-f
 RewriteCond %{REQUEST_URI} !-d 
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.+)/$ http://website.com/$1 [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteCond %{REQUEST_URI} !-f
 RewriteCond %{REQUEST_URI} !-d 
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_URI} !\.(css|gif|ico|jpg|js|png|swf|txt)$
 RewriteRule ^(.{5,16})$ profile.php?scrname=$1
 RewriteRule ^(.+)(\.php|\.html)/$  /$1$2 [R=301,L]
</IfModule>

同样,我们将非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您使用front controller,则可能会发现维护起来更容易。基本上,您将所有不是静态文件的请求重定向到单个PHP脚本,然后可以执行比mod_rewrite规则更容易在代码中表达的高级规则。

你的.htaccess可能看起来有点像:

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d 
RewriteRule ^(.*)$ index.php?q=$1

在PHP代码中,您可以通过检查$_GET['q']来决定要呈现的页面来处理它。

答案 1 :(得分:1)

自从我提出这个问题以来,我取得了一些进展。 这是我最终得到的(看似非常简单的)mod_rewrite:

<IfModule mod_rewrite.c>
   //mod_rewrite by Marc
   RewriteEngine On
   RewriteCond %{HTTPS} !=on
   RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
   RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
   RewriteCond %{SCRIPT_FILENAME} !-d  
   RewriteCond %{SCRIPT_FILENAME} !-f 
   RewriteRule ^(\w+)$ ./project.php?id=$1
</IfModule>

它完成我想要的一切,修复了内部服务器错误,因此我不再需要重写来删除.php。我希望它可以帮助别人。