仅针对一个文件的 RewriteRule

use*_*183 2 php apache .htaccess mod-rewrite

基本上我有下面的htaccess。目前它工作得很好,但它重定向了每个文件。例如,当我只想将 about.php 重定向到 /about 时,将 foo.php 重定向到 /foo。基本上我想强制删除 about.php 的 .php 扩展名,但只删除那个文件。

RewriteRule ^about$ about.php [L]
RewriteCond %{REQUEST_URI} ^/about.php$ [NC]
RewriteRule .* /about [R,L]
Run Code Online (Sandbox Code Playgroud)

现在我有了上面的代码。它现在会导致重定向错误过多。

Fab*_*ler 5

RewriteRule ^about$ about.php [L]
Run Code Online (Sandbox Code Playgroud)

这是您正确的rewrite,这意味着/about将处理一个请求,就好像它是一个请求/about.php

至于这个单独的问题:

我不希望用户看到 about.php 即使他输入了

您将需要从to重定向。这就是你的第二行和第三行所做的(带有重定向标志的RewriteRule ),但条件是广泛的,并且还包含一些超流利的东西:/about.php/about[R]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]
Run Code Online (Sandbox Code Playgroud)

将其更改为:

RewriteCond %{REQUEST_URI} ^/about.php$ [NC]
RewriteRule .* /about [R,L]
Run Code Online (Sandbox Code Playgroud)

这是否保留 GET 参数?

如果添加[QSA]标志(查询字符串追加),是的。

更新

正如@PeterWooster 指出的那样,重定向部分可以简化为:

Redirect /about.php /about
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要条件和正则表达式,这很好,但重定向指令是为 OP 的用例设计的。 (2认同)