Heim > Fragen und Antworten > Hauptteil
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粉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,而不是为了让你的应用程序“工作”。
所以,总而言之,按以下顺序:
/server/ServerName
格式的 URL。/server/?Server=ServerName
(或 /server/index.php?Server=ServerName< /code>) 到 /server/ServerName
(规范 URL)。
/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 时相关。)