【问题标题】:Rewrite pagerequests to index.php, filerequests to app/webroot directory重写pagerequests到index.php,filerequests到app/webroot目录
【发布时间】:2011-03-14 05:35:46
【问题描述】:

嘿,我已经阅读 StackOverflow.com 很长时间了,但我决定注册一个问题。我正在编写自己的轻量级 MVC 框架,在 index.php 中路由页面请求。

页面请求看起来像 /controller/action/arg1/arg2/arg3,它们应该被重写为 index.php?route=[request]。所以,像 site.com/user/profile/123 这样的 [request] 应该重写为 index.php?route=user/profile/123

但是,文件并不意味着要重写为 index.php。图片和样式表等资源位于 /app/webroot/ 文件夹中,不需要执行 PHP。因此,mod_rewrite 引擎应该将所有文件请求重写到 /app/webroot/,并在文件不存在时提供配置的 404 ErrorDocument。

目录结构

  • ./index.php
  • ./app/webroot/scripts/helpers/hamster.js
  • ./app/webroot/images/logo.png
  • ./app/webroot/style/main.css

由于您可以仅通过文件扩展名/点的存在来区分文件请求 (/squirrel.png) 和页面请求 (/user/profile/123),我期待这真的是简单。但是...我真的很难过,我希望有人能帮助我。

我试过的东西是……

重写引擎开启

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

重写规则 ^(.*)$ app/webroot/$1 [L]

RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

...但除了正确重定向到现有文件之外,它并没有真正起作用。页面请求或不存在的文件会导致 HTTP 500 错误。

非常感谢任何帮助! =)

【问题讨论】:

  • 您应该检查您的网络服务器的日志。页面请求上的错误 500 可能意味着您的应用中存在错误
  • 我也想过这个问题。但这里的问题仅在于 .htaccess 文件中的无效条目。 (现在 index.php 的第一行调用 die($_GET['route']) 进行测试,所以问题不存在)

标签: php mod-rewrite


【解决方案1】:

看看这是否更符合您的预期:

RewriteEngine On

# These two lines are very specific to your current setup, to prevent
# mod_dir from doing what it does, but in a more controlled way
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/iceberg[^/]
RewriteRule .* http://localhost/iceberg/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}      !^/app/webroot
RewriteCond %{REQUEST_URI}       \.[a-z]+$ [NC]
RewriteRule ^.*$ app/webroot/$0 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}      !^/app/webroot
RewriteRule ^.*$ index.php?route=$0 [QSA,L]

另外,解释一下,你得到 500 错误的原因很可能是因为你的规则:

RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]

由于它是无条件的,并且正则表达式模式将始终匹配,因此您的重写将一遍又一遍地执行(L 标志不会阻止这一点,因为在您重写为 index.php 之后,会进行内部重定向在 Apache 内部,进程会丢失其当前状态)。

【讨论】:

  • 非常感谢蒂姆,这很好用!但是,以下请求的行为“奇怪”: - localhost/iceberg :当没有尾部斜杠时,它会出现在浏览器的地址栏中:localhost/iceberg/?route=/Users/nilsw/Web/iceberg。我想将其重写为 index.php?route=[empty string or '/'] -localhost/iceberg/images/notexist.png,它会引发 HTTP 500 错误代码。 (而不是 404 文档)
  • 是您的网站(和.htaccess)所在的iceberg 目录吗?这种情况是由mod_dirDirectorySlash 选项引起的,在这种情况下会导致一些非常混乱的行为。 “在生产中”,站点的根目录应该总是有一个初始斜杠,这可以防止这个问题(注意这只会在你指向一个没有尾部斜杠的真实目录时发生)。不过,我会用一个潜在的修复来更新答案。
  • 另外,我不确定第二种情况下的问题是什么(它不会在我的测试服务器上发生),但我正在添加其他内容,希望能导致预期的 404 响应.
  • 再次感谢蒂姆的帮助。我已将 Iceberg 移至我的根 public_html 文件夹,问题已消失。对于不在根文件夹中的情况,在 index.php 的第 1 行有一个临时解决方法: if($_GET['route'][0] == '/') $_GET['route'] = '/';现在一切都按预期工作(不存在文件的 404 响应除外)
  • 没问题,很高兴为您提供帮助。如果您可以检查您的服务器日志以查看由于缺少 404 响应而弹出什么样的错误,我希望我们也能够解决该问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多