Php 制定规则以模拟reddit';铁轨还是铁轨?
为了好玩,我想用php制作一个reddit克隆。我基本上有java方面的经验,但如果这很重要的话,我知道如何使用php。我对Rails3的经验也非常有限,我相信Rails处理URL的方式也接近于我想要的处理方式 到目前为止,在.htaccess中,我有: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 ^(.+)
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]