Php 制定规则以模拟reddit';铁轨还是铁轨?

Php 制定规则以模拟reddit';铁轨还是铁轨?,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,为了好玩,我想用php制作一个reddit克隆。我基本上有java方面的经验,但如果这很重要的话,我知道如何使用php。我对Rails3的经验也非常有限,我相信Rails处理URL的方式也接近于我想要的处理方式 到目前为止,在.htaccess中,我有: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)

为了好玩,我想用php制作一个reddit克隆。我基本上有java方面的经验,但如果这很重要的话,我知道如何使用php。我对Rails3的经验也非常有限,我相信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的末尾自动添加一个/a,这样它就变成了localhost/r/all/I所希望的,并且已经尝试过创建一个重写规则,如:

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.com中。 我正在/var中对其进行这些更改的My.htaccess文件

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

<Directory /var>
AllowOverride All
</Directory>

允许超越所有
我第一次试着把它当作

<Directory /var/www> 

把.htaccess放到www上,但它永远不会被读取。我知道它没有被读取,因为我在里面放了垃圾,没有错误。但是,如果垃圾在/var中,并且Drectory指令指定了/var,那么我会得到一个错误。

尝试这个(未测试):

我觉得您尝试的问题很可能是规则的顺序,重定向
重写规则
上缺少
重写cond
,和/或您没有在重定向
重写规则
中添加
L
标志-但是上面的正则表达式让我比您更高兴,因为他们对匹配的内容更为明确

实际上,我不确定mod_rewrite是否支持我在上面使用的所有正则表达式功能,因此如果您继续出现错误,这可能是原因-如果您确实有问题,请返回此处,我将更仔细地查看。

尝试以下方法(未经测试):

我觉得您尝试的问题很可能是规则的顺序,重定向
重写规则
上缺少
重写cond
,和/或您没有在重定向
重写规则
中添加
L
标志-但是上面的正则表达式让我比您更高兴,因为他们对匹配的内容更为明确


实际上,我不确定mod_rewrite是否支持我上面使用的所有正则表达式功能,因此,如果您继续遇到错误,这可能是原因-如果您确实有问题,请返回此处,我将更仔细地查看。

那么您希望将任何不以/结尾的请求URI重定向到相同的URI,但在结尾添加/吗?或者你也在尝试做别的事情?我不明白你为什么会关心结尾斜杠..这正是我想做的。所以你想让任何不以/结尾的请求URI重定向到相同的URI,但在结尾添加/吗?或者你也在尝试做别的事情?我不明白你为什么会关心结尾斜杠..这正是我想做的。第二个斜杠什么也不做,第一个给出了一个错误:“RewriteRule:bad flag delimiters'@user779608试试上面的代码,我切换回了你原来的规则进行实际的重写。它添加了斜杠,这很好,但也添加了WW。这是对“”的请求。我可能设置不正确吗?@user779608是由上述规则以外的其他规则添加的。我刚刚测试过这个,它在我的笔记本电脑上的效果和预期完全一样,你的DocumentRoot目录是否有可能命名为
www
?在PHP中,您检查哪个变量来获取URL?在PHP中,您使用哪个变量?您应该使用
$\u SERVER['PATH\u INFO']
进行此操作…第二个没有任何作用,第一个出现错误:'RewriteRule:bad flag delimiters'@user779608请尝试上面的代码,我切换回您的原始规则进行实际重写。它添加了斜杠,这很好,但也添加了WW。这是对“”的请求。我可能设置不正确吗?@user779608是由上述规则以外的其他规则添加的。我刚刚测试过这个,它在我的笔记本电脑上的效果和预期完全一样,你的DocumentRoot目录是否有可能命名为
www
?在PHP中,您检查哪个变量来获取URL?在PHP中,您使用哪个变量?您应该为此使用
$\u服务器['PATH\u INFO']
。。。
# 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]