我正在尝试使用 htaccess 文件执行简单的重写规则。我使用 XAMPP 在本地主机上托管此页面:
localhost/naveesh/services.php
请求此操作的可能方法如下:
localhost/naveesh/services?serv=Boat%20Dealers
我想做的是将以下 URL 的请求重写为上述 URL
localhost/naveesh/services/Boat-Dealers
我尝试了这个,但它给了我一个 404 错误。
RewriteEngine On RewriteRule ^/naveesh/services/([^/]+)/?$ /naveesh/services.php?serv= [L,QSA]
经过一番研究,我尝试了另一种选择:
RewriteEngine On RewriteBase /naveesh/ # Hide .php extension RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ .php [L] RewriteRule ^services/([^/]+)/?$ /services.php?serv= [L,QSA]
但是,现在出现了太多内部重定向问题
这是您的第一条规则(“隐藏 .php 扩展名”)导致“内部重定向过多”,因为它(错误地)将对
services/Boat-Dealers.php
的请求重写为 services/Boat-Dealers.php.php 等。这是因为条件(始终成功)没有检查您最终重写的内容。REQUEST_FILENAME
不是您期望的那样。 (尽管颠倒这些规则的顺序可以解决这个迫在眉睫的问题。)请参阅我对以下ServerFault 上的问题 有关此特定问题的更多详细信息。
但是,第二条规则也是不正确的(如 @Faizal 的回答中所述)。
这些规则的顺序也是错误的。
假设您的
.htaccess
文件位于/naveesh/.htaccess
(不是文档根目录),那么您的完整.htaccess
文件应该看起来像这样:请注意,替换字符串上的斜杠前缀已被删除。
此处不需要
RewriteBase
指令。相对替换是相对于.htaccess
文件所在的目录。您需要确保禁用
MultiViews
,因为如果禁用,此规则将无法按预期工作。该请求将被重写为services.php
,但不包含serv
URL 参数。 (有时会在某些共享服务器上启用多视图,这会导致许多冲突。)此外,您不应该真正允许在请求的 URL 上使用可选的尾部斜杠。这可能会导致重复内容问题,因为您有两个不同的 URL(一个带有尾部斜杠,一个不带尾部斜杠)提供相同的内容。您的示例 URL 中没有尾部斜杠,那么为什么要包含它呢?如果您需要允许可选的尾部斜杠(例如,如果您有一些指向非规范 URL 的错误入站链接),那么您应该从外部将一个链接重定向到另一个。