我正在建立一个小型的本地社交好社区网站,其中每个项目都有自己的网址,这样当用户名='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>
同样,我们将非常感谢任何帮助。
答案 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。我希望它可以帮助别人。