首页  >  问答  >  正文

Apache 2.4 URL 重写:/server/?Server=ServerName 至 /server/ServerName

我试图简单地将 URL 从 /server/?Server=ServerName 重写为 /server/ServerName,以便 ServerName 参数被传递给 PHP。

我当前在我的 .htaccess 文件中包含此内容:

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

尝试查看 /server/ServerName/server/?Server=ServerName 时,出现 404 错误。

这是我的重写日志:

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]

此时,我需要一点指导,因为我很沮丧,而且我觉得我错过了一件简单的事情。

我尝试过进行调整:

我也一直在研究重写代码,试图看看它是否真的在重写。

使用下面的代码成功地将目录 /test2/ 重写为 /server/?Server=ServerName 并且页面加载正常,因此我知道该模块处于活动状态并且正在运行.

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

尝试进行此更改但没有成功。 URL 不会重写,但页面会加载。 Apache 2.4 .htaccess 友好的 URL 重写

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

P粉038161873P粉038161873251 天前383

全部回复(1)我来回复

  • 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= [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 时相关。)

    回复
    0
  • 取消回复