suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Apache 2.4-URL: /server/?Server=ServerName lautet /server/ServerName

Ich versuche einfach die URL vom /server/?Server=ServerName 重写为 /server/ServerName,以便 ServerName-Parameter an PHP zu übergeben.

Ich habe derzeit Folgendes in meiner .htaccess-Datei:

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} Server=([^&]+)
RewriteRule "^server/$" "/server/%1/?"

Beim Versuch, /server/ServerName/server/?Server=ServerName anzuzeigen, erhielt ich einen 404-Fehler.

Das ist mein Umschreibeprotokoll:

init rewrite engine with requested uri /server/
pass through /server/
strip per-dir prefix: C:/wamp64/www/server/ -> server/
applying pattern '^server/$' to uri 'server/'
RewriteCond: input='Server=ServerName' pattern='Server=([^&]+)' => matched
rewrite 'server/' -> '/server/ServerName/?'
split uri=/server/ServerName/? -> uri=/server/ServerName/, args=<none>
trying to replace prefix C:/wamp64/www/ with /
trying to replace context docroot C:/wamp64/www with context prefix 
internal redirect with /server/ServerName/ [INTERNAL REDIRECT]

An diesem Punkt brauche ich eine kleine Anleitung, weil ich frustriert bin und das Gefühl habe, dass mir eine einfache Sache entgeht.

Ich habe versucht, Folgendes anzupassen:

Ich habe auch darüber nachgedacht, den Code neu zu schreiben, um zu sehen, ob er tatsächlich neu geschrieben wird.

Mit dem folgenden Code habe ich das Verzeichnis erfolgreich verschoben /test2/ 重写为 /server/?Server=ServerName und die Seite wurde einwandfrei geladen, sodass ich weiß, dass das Modul aktiv ist und ausgeführt wird.

RewriteRule ^test2/$ /server/?Server=ServerName [PT,L,R=301]

Versucht, diese Änderung vorzunehmen, ohne Erfolg. Die URL wird nicht neu geschrieben, aber die Seite wird geladen. Apache 2.4 .htaccess-freundliches URL-Umschreiben

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=? [L]

P粉038161873P粉038161873302 Tage vor441

Antworte allen(1)Ich werde antworten

  • P粉182218860

    P粉1822188602024-01-17 13:48:59

    你似乎搞错了方向。您应该链接到 HTML 源中的 /server/ServerName,因此在内部将请求从 /server/ServerName 重写为 /em> /server/index.php?Server=ServerName (请注意添加 index.php,如注释中所述)。 /server/index.php?Server=ServerName 是实际处理请求的底层(隐藏)文件路径。

    尽管你似乎在最后一行中就已经提到了......

    URL 必须重写,否则页面将无法加载。对于“重写”到底是什么可能存在一些困惑。这不会更改 URL。您不使用.htaccess更改 URL。您必须在 HTML 源中手动更改 URL - 您要链接到的 URL。

    如果您愿意,您可以(可选)稍后实现外部“重定向” - 这确实会更改 URL。但这用于重定向可能链接到旧网址或对其建立索引的搜索引擎和第三方。所以,这是为了 SEO,而不是为了让你的应用程序“工作”。

    所以,总而言之,按以下顺序:

    1. 更改 HTML 源代码中的 URL,以便链接到 /server/ServerName 格式的 URL。
    2. (可选)如果您要更改现有 URL 结构,请将任何直接请求重定向到 /server/?Server=ServerName (或 /server/index.php?Server=ServerName< /code>) 到 /server/ServerName (规范 URL)。
    3. 在内部将请求从 /server/ServerName(规范 URL/您要链接到的 URL)重写为 /server/index.php?Server=ServerName (处理请求的底层文件)。

    在根.htaccess文件中:

    RewriteEngine On
    
    # (OPTIONAL) For SEO, if changing an existing URL structure...
    # Redirect "/server/?Server=ServerName" to "/server/ServerName"
    RewriteCond %{QUERY_STRING} ^Server=([^&./]+)(&|$) [NC]
    RewriteRule ^server/(index\.php)?$ /server/%1 [NE,R=301,L]
    
    # Rewrite request from "/server/ServerName" to "/server/index.php?Server=ServerName"
    RewriteRule ^server/([^/.]+)$ server/index.php?Server=$1 [END]

    这假设您使用的是 Apache 2.4,以便能够在最后一条规则中使用 END 标志。这避免了在检查直接请求而不是“重写”请求的第一条规则中必须有一个额外的条件(以避免重定向循环)。

    在第一条规则(“重定向”)中,index.php 部分是可选的。 %1 反向引用包含在前面的条件中捕获的Server URL 参数的值。 Server URL 参数必须非空且不包含点或斜杠(根据您在上一条规则中给出的正则表达式),否则不会重定向或重写。请注意,正则表达式字符类中的文字点不需要反斜杠转义。

    请注意,我假设(根据您的示例)所请求的 URL 以尾部斜杠结尾(即 /server/ServerName 而不是 < code>/server/ServerName/),因此我删除了 RewriteRule pattern 末尾的可选 /?最后一条规则。尽管您的日志摘录似乎另有暗示?如果您确实需要允许尾随斜杠和非尾随斜杠 URL,那么这应该作为单独的“重定向”实现,以便规范化 URL,而不是作为“重写”的一部分,否则会促进重复内容(斜杠和无斜杠 URL 是不同的 URL)。

    根据您在 Server URL 参数值中期望的值,NE (noescape) 标志可能是也可能不是必需的。 QUERY_STRING 服务器变量已进行 URL 编码。

    您不需要在 .htaccess 中使用 PT (passthrough) 标志,因为这是此上下文中的默认行为。 (PT 标志仅在服务器虚拟主机 上下文中使用 mod_rewrite 时相关。)

    Antwort
    0
  • StornierenAntwort