1

为了好玩,我想在 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 中时有垃圾,并且 Dectory 指令指定 /var,我会收到错误消息。

4

1 回答 1

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]

我觉得您尝试的问题可能是规则的顺序,重定向中的缺失RewriteCondRewriteRule/或您没有L在重定向中放置标志RewriteRule- 但上述正则表达式让我比你的更快乐,因为它们对匹配的内容更具体一些。

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

于 2012-07-20T20:17:37.103 回答