首页 > 解决方案 > htaccess 总是删除 .php 但保留查询字符串 (AJAX)

问题描述

在一个网站上,出于美化原因,我想从 URL 中删除所有 .php 文件扩展名。

我在网上找到的大多数 RewriteRules 只从 /site 重写,而不是从 /site.php 重写到 /site。

我像这样解决了这个问题,效果很好。如果用户现在在浏览器中键入 /site.php,它会自动将其重写为 /site。伟大的!

但是现在我的 Ajax 不再工作了,因为查询字符串既没有保存在 /site 也没有保存在 /site.php。

RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1?%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

我尝试将?%1添加到第一个 RewriteCond:

RewriteCond %{THE_REQUEST} /([^.]+)\.php?%1 [NC]
RewriteRule ^ /%1?%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

Ajax 调用再次起作用,但现在 /site.php 仍然是 /site.php。

如何在我的 RewriteCond 中同时拥有这两个功能?

标签: .htaccess

解决方案


您可以在站点根目录 .htaccess 中使用这些规则:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

这将保留查询字符串。


推荐阅读