使用htaccess将目录URL重写为PHP文件



我正在尝试使用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]

但是,它现在给出了太多的内部重定向问题

RewriteEngine On
RewriteBase /naveesh/
# Hide .php extension
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
RewriteRule ^services/([^/]+)/?$ /services.php?serv=$1 [L,QSA]

这是你的第一条规则("Hide .php extension"),导致"太多的内部重定向"因为它(错误地)将对services/Boat-Dealers.php的请求重写为services/Boat-Dealers.php.php等。这是因为条件(总是成功的)并没有检查您最终要重写的内容。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]

注意替换字符串上的斜杠前缀被删除。

这里不需要RewriteBase指令。相对替换相对于.htaccess文件所在的目录。

您需要确保禁用MultiViews,因为如果禁用,此规则将无法按预期工作。请求将被重写为services.php,但没有servURL参数。(MultiViews有时在一些共享服务器上启用,这是许多冲突的原因。)

另外,你不应该在请求的URL上允许一个可选的斜杠。这可能会导致重复内容问题,因为有两个不同的url(一个带斜杠,一个不带斜杠)提供相同的内容。示例URL中没有尾斜杠,那么为什么要包含它呢?如果你需要允许一个可选的尾斜杠(例如。如果你有一些错误的入站链接到非规范的URL),那么你应该从外部重定向一个到另一个。