Heim  >  Fragen und Antworten  >  Hauptteil

Verwenden Sie htaccess, um die URL eines Verzeichnisses in eine PHP-Datei umzuschreiben

Ich versuche, einfache Umschreiberegeln mithilfe von htaccess-Dateien durchzuführen. Ich hoste diese Seite auf localhost mit XAMPP:

localhost/naveesh/services.php

Mögliche Möglichkeiten, diesen Vorgang anzufordern, sind wie folgt:

localhost/naveesh/services?serv=Boat%20Dealers

Ich möchte die Anfrage für die folgende URL in die obige URL umschreiben

localhost/naveesh/services/Boat-Dealers

Ich habe es versucht, aber es gab einen 404-Fehler.

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

Nach einiger Recherche habe ich eine andere Option ausprobiert:

RewriteEngine On
RewriteBase /naveesh/

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

RewriteRule ^services/([^/]+)/?$ /services.php?serv= [L,QSA]

Allerdings gibt es jetzt zu viele interne Weiterleitungsprobleme

P粉957723124P粉957723124257 Tage vor356

Antworte allen(1)Ich werde antworten

  • 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=$1 [QSA,L]
    
    # Hide .php extension
    RewriteCond %{DOCUMENT_ROOT}/naveesh/$1.php -f
    RewriteRule ^(.*?)/?$ $1.php [L]

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

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

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

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

    Antwort
    0
  • StornierenAntwort