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

问题描述 投票:0回答:1

我正在尝试简单地将 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]

在这一点上,我需要一点指导,因为我很沮丧,我觉得这是我缺少的一件简单的事情。任何帮助将不胜感激。

我尝试从以下方面进行调整: mod_rewrite 查询字符串返回 404 .htaccess 中 $1 与 %1 的区别 为什么使用 .htaccess RewriteRule 找不到 404? 使用 https://httpd.apache.org/docs/2.4/rewrite/remapping.html 中的示例https://cheatography.com/davechild/cheat-sheets/mod-rewrite/

引用标志

我也一直在尝试重写代码以查看它是否真的在重写。

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

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

没有运气就尝试了这个改变。网址不会重写,但页面会加载。 Apache 2.4 .htaccess 友好 URL 重写

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=$1? [L]
apache mod-rewrite url-rewriting
1个回答
0
投票

将 URL 从

/server/ServerName
 改写为 
/server/?Server=ServerName
:

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

你似乎理解错了。您应该在 HTML 源代码中链接到

/server/ServerName
,因此在内部重写请求 from
/server/ServerName
to
/server/index.php?Server=ServerName
(注意添加
index.php
,如评论中所述)。
/server/index.php?Server=ServerName
是实际处理请求的底层(隐藏)文件路径。

尽管您似乎必须在最后一行中正确使用它...

URL 不重写,但页面加载。

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

URL 必须重写,否则页面无法加载。关于“重写”实际上是什么,可能会有一些混淆。这不会更改 URL。您不使用

.htaccess
change URL。您必须在 HTML 源代码中手动更改 URL - 您链接到的 URL。

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

所以,总而言之,按照这个顺序:

  1. 更改 HTML 源中的 URL,以便链接到
    /server/ServerName
    .
  2. 形式的 URL
  3. (可选)如果您要更改现有的 URL 结构,则将任何直接请求重定向到
    /server/?Server=ServerName
    (或
    /server/index.php?Server=ServerName
    )到
    /server/ServerName
    (规范 URL)。
  4. 在内部将请求从
    /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
标志。这避免了在检查直接请求而不是“重写”请求(以避免重定向循环)的第一条规则中必须有一个额外的condition

在第一条规则(“重定向”)中,

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

根据您在

Server
URL 参数值中期望的值,
NE
(
noescape
) 标志可能需要也可能不需要。 QUERY_STRING` 服务器变量已经进行了 URL 编码。

© www.soinside.com 2019 - 2024. All rights reserved.