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

问题描述 投票:0回答:2

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

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

php apache .htaccess mod-rewrite xampp
2个回答
1
投票

RewriteRule 据我所知,您使用的看起来不错,但是当 .htaccess 文件位于子目录中时,模式中的斜杠可能与路径不匹配。用这个

RewriteEngine On
RewriteBase /naveesh/
RewriteRule ^services/([^/]+)/?$ services.php?serv=$1 [L,QSA]

应该正确匹配URL并将请求重写为正确的URL。如果您仍然收到 404,请确保在您的

Apache 配置
中启用了mod_rewrite,并且对于 .htaccess 文件所在的目录,
AllowOverride
设置为全部。


0
投票
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 的错误入站链接),那么您应该从外部将一个重定向到另一个。

© www.soinside.com 2019 - 2024. All rights reserved.