使用 htaccess 将目录的 URL 重写为 PHP 文件
P粉957723124
P粉957723124 2024-01-10 17:18:14
0
1
355

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

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

P粉957723124
P粉957723124

全部回复(1)
P粉343408929

这是您的第一条规则(“隐藏 .php 扩展名”)导致“内部重定向过多”,因为它(错误地)将对 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= [QSA,L]

# Hide .php extension
RewriteCond %{DOCUMENT_ROOT}/naveesh/.php -f
RewriteRule ^(.*?)/?$ .php [L]

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

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

您需要确保禁用MultiViews,因为如果禁用,此规则将无法按预期工作。该请求将被重写为 services.php,但不包含 serv URL 参数。 (有时会在某些共享服务器上启用多视图,这会导致许多冲突。)

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!