首页  >  问答  >  正文

使用 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= [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粉957723124P粉957723124306 天前413

全部回复(1)我来回复

  • P粉343408929

    P粉3434089292024-01-11 16:05:46

    这是您的第一条规则(“隐藏 .php 扩展名”)导致“内部重定向过多”,因为它(错误地)将对 services/Boat-Dealers.php 的请求重写为 < code>services/Boat-Dealers.php.php 等。这是因为条件(始终成功)没有检查您最终重写的内容。 REQUEST_FILENAME 不是您期望的那样。 (尽管颠倒这些规则的顺序可以解决这个迫在眉睫的问题。)

    请参阅我对以下ServerFault 上的问题< /a> 有关此特定问题的更多详细信息。

    但是,第二条规则也是不正确的(如 @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 的错误入站链接),那么您应该从外部将一个链接重定向到另一个。

    回复
    0
  • 取消回复