【问题标题】:RewriteRule - discard trailing slashRewriteRule - 丢弃尾部斜杠
【发布时间】:2019-08-28 15:05:45
【问题描述】:

我有一个带有 .htaccess 文件的 PHP 项目:

Options FollowSymLinks
RewriteEngine On
RewriteBase "/blog/"
RewriteRule "^([^.?/]+)/?$" "index.php?page=$1" [END,QSA]

我对 url localhost/blog/administration 有一个非常奇怪的问题。这绝对不是由 PHP 文件引起的,因为即使源代码为空也会发生。

我的问题是:当我输入localhost/blog/administration时,地址栏中的URL变成了localhost/blog/administration/?page=administration。在地址栏中输入localhost/blog/administration/(带有斜杠)后不会发生这种情况。

奇怪的是——给定的问题只发生在administration URL 上,而不是home

可能是什么原因?

免责声明:即使我使用新的浏览器(无缓存)和 index.php 和exit; 在开始时也会发生上述问题...

【问题讨论】:

  • 试试这个RewriteRule "^([^.?/]+)?$" "index.php?page=$1" [END,QSA]
  • @NemanjaJeremic 它有什么变化? /? 的目的是接受斜杠,但不需要它。
  • 我看到你使用([^.?/]+) 表示每个可能的标志。我假设你只需要在你的 URL 中输入字母。最好使用这样的东西。 RewriteRule ^([a-zA-Z]+)$ index.php?page=$1 [NC,L] .... 也是的,我在第一条评论中犯了一个错误。因为我没有在你的重写中看到。我认为这会有所帮助:)
  • 出于安全原因,如果 mod_dir 模块指向真实目录,则在 URI 末尾添加尾部斜杠。 /blog/administration/ 目录中没有index.php 吗?
  • @anubhava 哦...事实上我有administration/ 目录。这可能是真正的原因。谢谢!

标签: php .htaccess mod-rewrite


【解决方案1】:

出于安全原因,如果 Apache 的 mod_dir 模块指向真实目录,则在 URI 末尾添加尾部斜杠,否则可能会导致您的目录列出目录。

建议在您的/blog/administration/ 目录中包含index.php 以防止这种行为。否则,您可以有一个单独的规则在最终规则之前添加尾随规则:

Options FollowSymLinks -Indxes
RewriteEngine On
RewriteBase /blog/

# add a trailing slash to directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301]

RewriteRule ^([^./]+)/?$ index.php?page=$1 [END,QSA]

还要注意上面选项行中的-Indxes 以禁用目录列表。

【讨论】:

  • 感谢您的回答,但我决定在 .htaccess 中禁用 DirectorySlashDirectoryIndex。我熟悉文档中的安全警告,我不打算使用目录索引。
  • 禁用DirectorySlash 是一种安全风险,但禁用DirectoryIndex 是一个很好的措施。用于禁用目录列表-Indxes 使用(编辑答案)
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
相关资源
最近更新 更多