.htaccess Apache 2.4 URL重写:/server/?Server=ServerName到/server/ServerName [已关闭]

hrysbysz  于 2023-05-07  发布在  Apache
关注(0)|答案(1)|浏览(145)

**关闭。**这个问题是not about programming or software development。目前不接受答复。

这个问题似乎不是关于a specific programming problem, a software algorithm, or software tools primarily used by programmers的。如果你认为这个问题与another Stack Exchange site的主题有关,你可以留下评论,解释在哪里可以回答这个问题。
5天前关闭。
社区在5天前审查了是否重新打开此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我尝试简单地将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错误。
以下是我的rewrite log:

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 friendly URL rewrite

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

vdzxcuhz1#

将URL从/server/?Server=ServerName重写为/server/ServerName

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

你好像理解错了。您应该在HTML源代码中链接到/server/ServerName,因此在内部将请求 * 从 * /server/ServerName * 重写为 * /server/index.php?Server=ServerName(注意添加了index.php,如注解中所阐明的)。/server/index.php?Server=ServerName是实际处理请求的底层(隐藏)文件路径。
虽然你最后一句台词好像说得很对
URL不会重写,但页面会加载。

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

URL必须重写,否则页面将无法加载。对于“重写”实际上是什么,可能会有一些混淆。这不会改变URL。你不能使用.htaccess来修改URL。您必须手动更改HTML源中的URL-您链接到的URL。
如果你愿意的话,你可以(可选地)在以后实现一个外部的“重定向”--这确实会改变URL。但这是 * 仅 * 重定向搜索引擎和第三方可能已链接到或索引旧的网址。所以,这是为了SEO,而不是让你的应用程序“工作”。
所以,总的来说,按照这个顺序:
1.更改HTML源中的URL,以便链接到格式为/server/ServerName的URL。
1.(可选)如果您正在更改现有的URL结构,则将任何直接请求重定向到/server/?Server=ServerName(或/server/index.php?Server=ServerName)到/server/ServerName(规范URL)。
1.在内部将请求从/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反向引用包含前面 condition 中捕获的Server URL参数的值。Server URL参数必须是非空的,并且不包含点或斜线(根据你在上一条规则中给出的正则表达式),否则它不会被重定向或重写。请注意,正则表达式字符类中的文字点不需要进行反斜杠转义。
请注意,我假设(根据您的示例)所请求的URL不会以尾随斜杠(即)结束。/server/ServerName而不是/server/ServerName/),所以我删除了最后一条规则中RewriteRule * 模式 * 末尾的可选/?。尽管你的日志摘录似乎表明不是这样?如果您确实需要允许尾随斜杠和非尾随斜杠URL,那么这应该作为一个单独的“重定向”来实现,以便规范化URL,而不是作为“重写”的一部分,否则会促进重复内容(有斜杠和无斜杠的URL是不同的URL)。
NEnoescape)标志可能是必需的,也可能不是必需的,具体取决于您在Server URL参数值中期望的值。QUERY_STRING服务器变量已经进行了URL编码。
您不需要在.htaccess中使用PTpassthrough)标志,因为这是此上下文中的默认行为。(PT标志仅在 servervirtualhost 上下文中使用mod_rewrite时相关。

相关问题