我试图简单地将 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=$1? [L]
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你似乎搞错了方向。您应该链接到 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,而不是为了让你的应用程序“工作”。
所以,总而言之,按以下顺序:
/server/ServerName格式的 URL。/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标志。这避免了在检查直接请求而不是“重写”请求的第一条规则中必须有一个额外的条件(以避免重定向循环)。在第一条规则(“重定向”)中,
index.php部分是可选的。%1反向引用包含在前面的条件中捕获的ServerURL 参数的值。ServerURL 参数必须非空且不包含点或斜杠(根据您在上一条规则中给出的正则表达式),否则不会重定向或重写。请注意,正则表达式字符类中的文字点不需要反斜杠转义。请注意,我假设(根据您的示例)所请求的 URL 不以尾部斜杠结尾(即
/server/ServerName而不是 /server/ServerName/),因此我删除了RewriteRulepattern 末尾的可选/?最后一条规则。尽管您的日志摘录似乎另有暗示?如果您确实需要允许尾随斜杠和非尾随斜杠 URL,那么这应该作为单独的“重定向”实现,以便规范化 URL,而不是作为“重写”的一部分,否则会促进重复内容(斜杠和无斜杠 URL 是不同的 URL)。根据您在
ServerURL 参数值中期望的值,NE(noescape) 标志可能是也可能不是必需的。QUERY_STRING服务器变量已进行 URL 编码。您不需要在
.htaccess中使用PT(passthrough) 标志,因为这是此上下文中的默认行为。 (PT标志仅在服务器 或虚拟主机 上下文中使用 mod_rewrite 时相关。)