5

我已经查看了这些解决方案,但它们都没有真正在我身上正常工作:

mod_rewrite 删除 .php 但仍提供 .php 文件?

如何从网站地址中删除文件扩展名?

如何使用 Apache Mod_rewrite 删除 php 扩展,同时保留 GET 参数?

他们只是不做以下事情,这是我需要做的:

1)从文件中删除 .php 扩展名,而不是 /index.php 显示 /index

2)保留GET参数(我在加载文件时读取并存储在会话cookie中,在标题中),因此/index.php?a=1&b=2可能显示/index/a1/b2

3)在子域和 https:// 上工作,而不会完全弄乱 URL 或最终陷入无限循环或其他东西......

有谁知道如何将这些规则组合在一起,以便正确涵盖上述 3 点?

这是我作为起点的工作:

RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
4

3 回答 3

6

你看错了。您不想将对 .php 文件的请求重定向到一个干净的地址,因为您从不希望用户首先看到 .php。相反,您需要接受一个不以 .php 结尾的请求,然后检查文件(在表面之下)是否实际上具有 .php 扩展名。然后,如果是这种情况,默默地重写请求以添加 .php 扩展名,这样用户就不需要看到扩展名了。

尝试以下操作:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([a-zA-Z0-9_-]+)/?$ /$1.php [QSA]

一旦将“.php”添加到请求的末尾,RewriteCond 就会检查请求(附加到 DOCUMENT_ROOT 路径的末尾)是否形成有效的文件名。如果是这样,则允许 RewriteRule 静默重写请求,以便将“.php”添加到请求路径中。QSA 标志告诉 mod_rewrite 将现有查询字符串附加到新请求路径的末尾,因此应保留您的 GET 变量。

$1请注意, DOCUMENT_ROOT 可能已经或可能没有尾部斜杠,因此您可能需要在 RewriteCond之前去掉斜杠。

至于查询字符串参数,mod_rewrite 无法处理无限数量的变量,因此您需要在问题中给出明确的请求模式,然后 mod_rewrite 解决方案才能提供将其映射到查询字符串的方法。

于 2013-04-27T16:38:04.090 回答
3

通过启用 mod_rewrite 和 .htaccess httpd.conf,然后将此代码放在您.htaccessDOCUMENT_ROOT目录下:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

一旦您确认它工作正常,然后更改R=302R=301. (在测试您的 mod_rewrite 规则时避免使用R=301(Permanent))。

于 2013-04-27T18:01:27.807 回答
0

尝试以下操作:

RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
于 2014-05-27T15:20:51.810 回答