我正在尝试使用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
,但没有serv
URL参数。(MultiViews有时在一些共享服务器上启用,这是许多冲突的原因。)
另外,你不应该在请求的URL上允许一个可选的斜杠。这可能会导致重复内容问题,因为有两个不同的url(一个带斜杠,一个不带斜杠)提供相同的内容。示例URL中没有尾斜杠,那么为什么要包含它呢?如果你需要允许一个可选的尾斜杠(例如。如果你有一些错误的入站链接到非规范的URL),那么你应该从外部重定向一个到另一个。