**关闭。**这个问题是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]
在这一点上,我需要一个小方向,因为我很沮丧,我觉得这是一个简单的事情,我错过了。
我尝试了以下调整:
- mod_rewrite query strings returning 404
- Difference between $1 vs %1 in .htaccess
- Why I get 404 not found with the .htaccess RewriteRule?
- 使用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]
尝试这种变化,但没有运气。URL不会重写,但页面会加载。Apache 2.4 .htaccess friendly URL rewrite
RewriteRule ^server/([^/\.]+)/?$ /server/?Server=$1? [L]
1条答案
按热度按时间vdzxcuhz1#
将URL从
/server/?Server=ServerName
重写为/server/ServerName
:你好像理解错了。您应该在HTML源代码中链接到
/server/ServerName
,因此在内部将请求 * 从 */server/ServerName
* 重写为 */server/index.php?Server=ServerName
(注意添加了index.php
,如注解中所阐明的)。/server/index.php?Server=ServerName
是实际处理请求的底层(隐藏)文件路径。虽然你最后一句台词好像说得很对
URL不会重写,但页面会加载。
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
文件中:这里假设您使用的是Apache 2.4,以便能够在最后一条规则中使用
END
标志。这避免了在第一个规则中必须有一个额外的 * 条件 * 来检查直接请求,而不是“重写”请求(以避免重定向循环)。在第一条规则(“重定向”)中,
index.php
部分是可选的。%1
反向引用包含前面 condition 中捕获的Server
URL参数的值。Server
URL参数必须是非空的,并且不包含点或斜线(根据你在上一条规则中给出的正则表达式),否则它不会被重定向或重写。请注意,正则表达式字符类中的文字点不需要进行反斜杠转义。请注意,我假设(根据您的示例)所请求的URL不会以尾随斜杠(即)结束。
/server/ServerName
而不是/server/ServerName/
),所以我删除了最后一条规则中RewriteRule
* 模式 * 末尾的可选/?
。尽管你的日志摘录似乎表明不是这样?如果您确实需要允许尾随斜杠和非尾随斜杠URL,那么这应该作为一个单独的“重定向”来实现,以便规范化URL,而不是作为“重写”的一部分,否则会促进重复内容(有斜杠和无斜杠的URL是不同的URL)。NE
(noescape
)标志可能是必需的,也可能不是必需的,具体取决于您在Server
URL参数值中期望的值。QUERY_STRING
服务器变量已经进行了URL编码。您不需要在
.htaccess
中使用PT
(passthrough
)标志,因为这是此上下文中的默认行为。(PT
标志仅在 server 或 virtualhost 上下文中使用mod_rewrite时相关。