我正在尝试使用 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=$1 [L,QSA]
经过一些研究,我尝试了另一种选择:
RewriteEngine On
RewriteBase /naveesh/
# Hide .php extension
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
RewriteRule ^services/([^/]+)/?$ /services.php?serv=$1 [L,QSA]
但是,它现在给出了太多的内部重定向问题
RewriteRule 据我所知,您使用的看起来不错,但是当 .htaccess 文件位于子目录中时,模式中的斜杠可能与路径不匹配。用这个
RewriteEngine On
RewriteBase /naveesh/
RewriteRule ^services/([^/]+)/?$ services.php?serv=$1 [L,QSA]
应该正确匹配URL并将请求重写为正确的URL。如果您仍然收到 404,请确保在您的
Apache 配置中启用了
mod_rewrite
,并且对于 .htaccess 文件所在的目录,AllowOverride
设置为全部。
RewriteEngine On RewriteBase /naveesh/ # Hide .php extension RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ $1.php [L] RewriteRule ^services/([^/]+)/?$ /services.php?serv=$1 [L,QSA]
这是您的第一条规则(“隐藏 .php 扩展名”)导致“太多内部重定向”,因为它(错误地)将对
services/Boat-Dealers.php
的请求重写为 services/Boat-Dealers.php.php
等。这是因为 condition(即总是成功的)并没有检查您最终要重写的同一件事。 REQUEST_FILENAME
不是您期望的那样。 (尽管颠倒这些规则的顺序可以解决这个紧迫的问题。)
有关此特定问题的更多详细信息,请参阅我对以下ServerFault问题的回答。
但是,第二条规则也不正确(如 @Faizal 的回答 中所述)。
这些规则的顺序也是错误的。
假设您的
.htaccess
文件位于 /naveesh/.htaccess
(不是文档根目录),那么您完整的 .htaccess
文件应该如下所示:
# Disable MultiViews
Options -MultiViews
RewriteEngine On
RewriteRule ^services/([^/]+)/?$ services.php?serv=$1 [QSA,L]
# Hide .php extension
RewriteCond %{DOCUMENT_ROOT}/naveesh/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
注意 substitution 字符串上的斜杠前缀已被删除。
这里不需要
RewriteBase
指令。相对替换是相对于.htaccess
文件所在的目录。
您需要确保
MultiViews
被禁用,因为如果它被禁用,此规则将不会按预期工作。该请求将被重写为 services.php
但没有 serv
URL 参数。 (MultiViews 有时会在某些共享服务器上启用,这是许多冲突的原因。)
此外,您不应该真的允许在请求的 URL 上使用可选的尾部斜杠。这可能会使您面临重复内容问题,因为您有两个不同的 URL(一个有尾部斜线,一个没有尾部斜线)提供相同的内容。您的示例 URL 上没有尾部斜杠,为什么要包含它?如果您需要允许一个可选的尾部斜杠(例如,如果您有一些指向非规范 URL 的错误入站链接),那么您应该从外部将一个重定向到另一个。