制作RewriteRule来模拟reddit或Rails?

时间:2012-07-20 19:49:39

标签: php apache .htaccess mod-rewrite

为了好玩,我想在php中制作一个reddit克隆。我有大多数java经验,但知道我的方式围绕PHP,如果这很重要。我对Rails 3的体验非常有限,我相信rails如何处理URL也与我想要处理它的方式非常接近。

到目前为止,我有一个.htaccess:

RewriteEngine On
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ /index.php/$1 [L]

这会将每个页面路由到index.php,在那里我解析URI并使用交换机处理请求。我知道从长远来看这是不可扩展的,但我想要开始。

我的下一步是在像localhost / r / all这样的URL末尾自动添加一个/所以它本身就是localhost / r / all /我想要并尝试制作一个像RewriteRule一样:

RewriteRule ^/?(.+)$ /$1/ [R]

这给出了500错误。我认为这是因为它陷入无限循环的重定向,因为/ $ 1 /将等于^ /?(。+)。所以我需要这样的东西:

RewriteRule ^/?(.+)Does not end in a forwardlash$ /$1/ [R]

我该怎么做?我明白了! charecter可以用来表示它不应该匹配的条件,但我无法让它工作。

感谢任何建议。

修改

getenv("DOCUMENT_ROOT") //gives /var/www

我/var/www/index.php生活在/ www。 我正在进行这些更改的.htaccess文件存在于/ var。

我在/ var中有.htaccess,因为在我的httpd.cong中我有这个:

<Directory /var>
AllowOverride All
</Directory>

我首先尝试将其作为

<Directory /var/www> 

并将.htaccess放入www,但它永远不会被阅读。我知道这不是因为我把垃圾放在里面而且没有错误。但是,如果我在/ var中有垃圾,而Drectory指令指定/ var我会收到错误。

1 个答案:

答案 0 :(得分:1)

试试这个(未经测试):

# Turn mod_rewrite on, yada yada yada
RewriteEngine On
RewriteBase / 

# We'll want to do the redirect before rewriting anything
# Files obviously don't have a trailing slash, and directories require one - so
# we only need to check if the file exists
# I'm not actually sure if mod_rewrite understands non-capturing groups though
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?((?:.+?)[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301]

# Do the rewrite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php/$1 [L]

我觉得您尝试的问题很可能是规则的顺序,重定向RewriteCond上缺少RewriteRule和/或您没有放L重定向RewriteRule中的1}}标志 - 但上面的正则表达式让我比你更快乐,因为它们对于它们的匹配更加具体。

我真的不确定mod_rewrite是否支持我上面使用的所有正则表达式功能,所以如果你继续得到可能是原因的错误 - 如果你确实有问题我会回来我会仔细看看它。