【问题标题】:Clean URLs when directories and files share the same name目录和文件同名时清除 URL
【发布时间】:2018-03-30 18:40:08
【问题描述】:

我正在使用这个 sn-p 来启用干净的 URL,有效地删除 PHP 扩展。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension snippet

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

这很好用,但问题是我有一些目录与一些 PHP 文件同名。

因此,我得到的不是所需的页面,而是目录结构。

我尝试在所有重写规则之前添加DirectorySlash Off,但没有运气。

我读到如果我使用DirectorySlash Off,我必须删除RewriteCond %{REQUEST_FILENAME} !-d,这也不起作用。

更不用说我在寻找解决方案时尝试了大约十几个不同的 sn-ps。

处理我的场景的正确方法是什么?

【问题讨论】:

  • 请注意,如果您将-MultiViews 更改为+MultiViews,则不需要您编写的所有代码。它会自动完成,不仅使用php,还使用css 和js,png,等等。
  • @Konstantinos 感谢您的提示。但不幸的是,问题仍然存在。
  • 是的,我刚才提到你不需要所有的代码来完成可以通过 1 个字符更改完成的事情。现在对于您的其他问题,您想优先考虑什么?首先检查文件是否存在并加载它或首先检查文件夹是否存在并加载它?如果它们具有相同的名称,您希望首先加载什么。
  • 我想要加载文件,所以如果它们共享相同的名称,请优先考虑文件。
  • 需要一些例子。例如如果请求是example.com/abc/ 并且有/abc.php 以及一个名为/abc/ 的目录,那么您要加载/abc.php 吗?

标签: php apache .htaccess mod-rewrite clean-urls


【解决方案1】:

将您的 .htaccess 更改为此:

Options +FollowSymLinks -MultiViews -Indexes
RewriteEngine On
RewriteBase /

## hide .php extension snippet

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,NE,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
  • 出于安全原因,将DirectorySlash 作为默认值保持打开状态。
  • Options -Indexes 用于禁用目录列表。

【讨论】:

  • 很抱歉。所有带有 .php 的 URL 仍然这样显示。如果我删除 .php 我得到 404.
  • 我输入了 example.com/abc.php 。首先,我希望它没有.php,所以它会显示为example.com/abc。更重要的是,如果我输入example.com/abc.php并且有一个名为example.com/abc的目录我想加载example.com/abc.php
  • 删除/重写部分使用初始的 sn-p 正确完成(取自您的一个 SO 答案)。出现问题是因为某些文件的名称与目录相同。因此无法加载文件,而是加载目录。
  • 因为从文件中删除.php后,它与目录的名称完全相同。
  • 好的,我怀疑浏览器缓存错误或其他重写规则或其他 .htaccess 是问题,因为我在本地 Apache 上使用了此代码。我有一个/page.php 和一个名为/page/ 的目录。当我打开 localhost/page.php 时,它被重定向到 localhost/page/ 并在内部加载了 /page.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多