【问题标题】:mod_rewrite even existing files and foldersmod_rewrite 甚至现有的文件和文件夹
【发布时间】:2013-08-29 09:38:20
【问题描述】:

或者更好地说,将所有内容重写为app.php,除了/public/ 路径。我已经在四处寻找,但找不到真正可行的解决方案。基本上我想要的是每个 url 都将被路由到 app.php/route,即使该文件夹存在 - 除非有例外。目前我只是为 foo 和 bar 获取 403,但是它们应该被路由到 app.php/fooapp.php/bar。另一方面,/public/ 不应该被重写。

还有一些很酷但不是那么重要的事情,那就是 URL /app.php/ 将被重写为 app.php/app.php

我需要在我的 htaccess 中做什么才能实现这种重写方式?


目录结构:

-| projects
  -| SomeSite
    -| foo
      - .htaccess [deny from all]
    -| bar
      - .htaccess [deny from all]
    -| public
      -| css
      -| js
      -| img
    - app.php
    - .htaccess [mod_rewrite is here]

我目前正在重写htaccess:

DirectoryIndex app.php
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !(/public|app\.php)$
RewriteRule ^(.*)$ app.php/$1 [QSA,L,NC]

【问题讨论】:

  • 其他2个htaccess文件有重写规则吗? (在 foo 和 bar 中)
  • 在 REQUEST_FILENAME 上引用文档:“匹配请求的文件或脚本的完整本地文件系统路径,如果服务器已经确定的话” – 我认为这可能这里的问题是,服务器已经将目录 foo 查找为存在,但在那里找到了你的“全部拒绝”htaccess - 因此用 403 回答。你能取出拒绝来自请暂时验证一下?
  • @JonLin 不,只是一个deny from all
  • @CBroe 然后它确实重定向到 index.php。从所有人中删除拒绝是否安全?
  • Depends :-) 如果这个目录中的文件暴露在网络上会发生什么?里面有什么敏感的东西吗?只要你的重写到位,任何东西都会被重写到你的 app.php 中,所以没有机会直接访问那里的文件。但是现在让别人不小心用重写规则覆盖了你的 htaccess……

标签: apache .htaccess mod-rewrite


【解决方案1】:

将您的代码更改为:

DirectoryIndex app.php
Options +FollowSymLinks -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_URI} !/(public|app\.php)(/.*|)$ [NC]
RewriteRule ^(.*)$ app.php/$1 [L]

【讨论】:

  • 这给了我一个 500 错误。我想我应该注意到 WebRoot 不是我的文档根目录,如果相关的话,该目录实际上位于 htdocs/projects/WebRoot 中。
  • 似乎和我的重写规则一样工作(除了你的不区分大小写)。当我转到/foo 时,我仍然得到一个 403,所以没有什么不同。但是,正如 CBroe 建议的那样,如果足够安全,我可能会从 foo 和 bar 中删除 htaccess。只需要有人确认。顺便说一句,app.php/app.php 的东西呢?这可能吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多