我在我的.htaccess文件中使用了上面的内容

# BEGIN - Allow Sucuri Services
<IfModule mod_rewrite.c>
    RewriteRule ^sucuri-(.*)\.php$ - [L]
</IfModule>
# END - Allow Sucuri Services

<Files 403.shtml>
order allow,deny
allow from all
</Files>

# Disable MultiViews
Options +FollowSymLinks -MultiViews

RewriteEngine on

# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirect non-www to www
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

# Allow extensionless PHP URLs to work
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ci_index.php?/$1 [L]

我面临的问题是,每当我试图打开文件https://www.example.com/world-data时,它都会打开文件夹--https://www.example.com/world-data/而不是https://www.example.com/world-data.php

如何防止打开文件夹而不是打开文件?

推荐答案

我面临的问题是,每当我试图打开文件https://www.example.com/world-data时,它都会打开文件夹--https://www.example.com/world-data/而不是https://www.example.com/world-data.php

通常,在构造无扩展URL时应尽量避免这种情况,因为它会造成歧义--只有一个可以访问.

这是因为mod_dir会在您请求文件系统目录without的尾部斜杠时"修复"URL.它通过在末尾添加一个斜杠和301(永久)重定向来实现这一点.这对于从该目录(如果有的话)中的DirectoryIndex人提供服务是必要的.

为了覆盖这一行为并防止mod_dir附加尾部斜杠(并最终服务于DirectoryIndex),您需要在.htaccess文件的顶部附近设置以下内容(在Options指令之后放置它是一个合理的位置).

DirectorySlash Off

然而,您需要确保清除浏览器(和任何中间)缓存,因为浏览器将持久地缓存先前的301(永久)重定向(追加尾随斜杠).

参考文献:https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryslash

但是(#1),您还需要确保禁用自动生成的目录 list (Mod_Autoindex),否则您可能会发现,即使存在DirectoryIndex个文档,您的文件 struct 也会expose 出来.因此,相应地修改Options指令:

# Disable MultiViews and directory listings
Options +FollowSymLinks -MultiViews -Indexes

然而(#2),如果省略尾部斜杠,这实际上会使所有目录都不可访问.如果您希望请求的目录没有尾随斜杠,则需要手动附加尾随斜杠,因为mod_dir将不再为您执行此操作.例如,在附加.php文件扩展名的规则(即在代码中的# Allow extensionless PHP URLs to work规则之后)添加以下内容:

# Append the trailing slash to directories (if required)
RewriteCond %{DOCUMENT_ROOT}/$0 -d
RewriteRule .*[^/]$ /$0/ [R=301,L]

其中.*[^/]$匹配任何不以尾随斜杠结尾的URL路径.如果映射到物理目录的URL路径不包括点,则可以进一步优化以从正则表达式中排除点(从而避免测试您的静态assets资源 ).例如.^[^.]*[^/]$(不是也添加了字符串起始点).

$0反向引用包含与RewriteRule pattern匹配的整个URL路径.


抱歉,我漏掉了the comment you made on my earlier answer个.尽管这本身确实需要一个答案,因为它不一定是一个微不足道的解决办法.

Php相关问答推荐

在WooCommerce中处理客户总支出中的退款

如何在Woocommerce中禁用机器人添加到推车?

将文件添加到存档,而不重建存档

PHP Laravel Web应用启动时间&>15秒

根据WooCommerce购物车页面中的自定义 Select 添加费用

在WooCommerce上克隆订单时使用`add_product()`添加产品元数据

为什么PHP PDO忽略NOT NULL约束?

更改特定产品标签的 Woocommerce 产品名称

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

如何使用 PHP 创建简化的 twig 替换?

在 WooCommerce 订阅续订订单中设置送货方式

服务器升级到新的mysql版本8.0.34后查询错误

WordPress 分页无法正常工作

尽管有use指令,PHP 类在其他文件中仍处于可见状态

Laravel路由中的符号在slug中会创建额外的斜杠

如何在 laravel 中的同一个 slug 上显示不同的内容?

Xdebug 不会在断点处停止

PHP 合并/合并多维数组

Laravel 测试 assertJsonMissing 不适用于唯一的键.为什么?

PHP/Laravel 中的自定义时区