Apache 重写引擎未按预期工作

问题描述 投票:0回答:1

我正在寻求配置 Apache 重写引擎的帮助,因为我对它的使用还比较陌生。我的目标是在浏览器中访问文件时从 URL 中删除 PHP 扩展名,并确保 URL 结尾有斜杠(如果丢失)。不幸的是,我在当前配置中遇到了困难,因为它没有删除 PHP 扩展名,但我可以访问没有扩展名的文件。

例如,如果用户输入

https://example.com/test.php
,则应将其重写为
https://example.com/test/
。此外,所有 PHP 文件都应该可以通过以下格式的 URL 访问:

https://example.com/test.php
https://example.com/test
https://example.com/test/

这是我现在拥有的:

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

当我使用上面的配置并输入

https://example.com/test.php
时,它就保持这样。

apache .htaccess mod-rewrite
1个回答
0
投票

当我使用上面的配置并输入https://example.com/test.php时,它就保持这样。

那是因为您没有任何重定向规则来删除

.php
扩展名并添加尾随
/
。另请注意,您不需要 2 个单独的规则来在内部添加
.php

您可以在根 .htaccess 中使用以下规则:

RewriteEngine On

# removes .php and adds a trailing /
# i.e. to externally redirect /path/file.php to /path/file/
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1/ [R=307,NE,L]

# adds a trailing slash to non files 
# Adding a trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=307,NE]

# internally rewrites /path/file/ to /path/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

一旦确认其工作正常,请将

R=307
(临时重定向)替换为
R=308
(永久重定向)。在测试您的
R=308
规则时,避免使用
mod_rewrite
(永久重定向)。

© www.soinside.com 2019 - 2024. All rights reserved.