我在我的.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相关问答推荐

Laravel中的通配符Undot数组

使用额外的输入字段自定义WooCommerce单个产品

输入手写CSV时在PHP中进行日期判断

Htaccess-重写对&api.php";的API请求以及对";web.php";的其他请求

在特定订单状态更改时自定义WooCommerce订单发货项目

使用PHP curl的Amazon SP API批处理调用

Mod_重写子目录中相应的php文件

PHP MySQL求和子树并与父树累加

是否重新排序多维数组元素以将所有子数组中的子数组移动到元素列表的底部?

PHP-准备用于TCP套接字的数据包

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

SFTP在PHP(phpseclib3\Net\SFTP)-过滤目录列表结果服务器端可能吗?类似于psftp中的LS命令?

如何在WordPress REST API中判断应用程序密码

从 WooCommerce 购物车中删除总计部分,同时保留小计行

在具有Angular 的 Laravel 应用程序中,不显示图像

根据页面以及是否在促销,向 WooCommerce 中显示的价格添加前缀

Woocommerce的数量和价格条件

WooCommerce订单支付页面上的附加支付订单按钮

为什么foreach循环会输出每个结果?

使用php删除数组中相同数字的所有变体