我正在尝试简单地将 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]
将 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,而不是让你的应用程序“工作”。
所以,总而言之,按照这个顺序:
/server/ServerName
./server/?Server=ServerName
(或 /server/index.php?Server=ServerName
)到 /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
标志。这避免了在检查直接请求而不是“重写”请求(以避免重定向循环)的第一条规则中必须有一个额外的condition。
在第一条规则(“重定向”)中,
index.php
部分是可选的。 %1
反向引用包含在前面的 condition中捕获的
Server
URL 参数的值。 Server
URL 参数必须是非空的并且不包含点或斜杠(根据您在上一条规则中提供的正则表达式),否则它不会被重定向或重写。请注意,正则表达式字符类中的文字点不需要反斜杠转义。
根据您在
Server
URL 参数值中期望的值,NE
(noescape
) 标志可能需要也可能不需要。 QUERY_STRING` 服务器变量已经进行了 URL 编码。