【发布时间】:2021-03-30 05:46:41
【问题描述】:
我正在尝试以一种非常常见的方法重定向 URL,但是,我无法弄清楚这一点。我已经阅读了一篇又一篇文章,但无法取得任何进展。我只是想在 php 中将诸如“domain.com/xx/xxxxxxxxxx”之类的 URL 重定向到“/index.php?first=xx&last=xxxxxxxxxx”。我尝试了几个 apache mod_rewrites 并且可以让 URL 在浏览器中保持不变,但是当我查看 index.php 中的 $_SERVER['REQUEST_URI'] 时,它没有按预期显示。相反,它显示的是输入的 URI,而不是重写。它还总是添加 URL 的“xx”部分。比如:
URL: domain.com/ab/1234567890
PHP: ab/1234567890
ab/include/file.css
ab/include/another.css
Getting: $_SERVER['REQUEST_URI'] = domain.com/ab/1234567890
Desired: $_SERVER['REQUEST_URI'] = domain.com/index.php?first=ab&last=1234567890
没有'ab'目录,应该是寻找'include/file.css'之类的文件。
以下是我尝试过的一些重定向:
RewriteRule ^([a-zA-Z0-9/]+)$ index.php?first=$1
RewriteCond %{QUERY_STRING} /([a-z][a-z])/([a-zA-Z0-9]+)
RewriteRule ^/([a-z][a-z])/([a-zA-Z0-9]+)$ index.php?first=$1&last=$2 [L]
RewriteCond %{QUERY_STRING} ^[a-z][a-z]/[a-zA-Z0-9]$
RewriteRule ^[a-z][a-z]/[a-zA-Z0-9]+$ index.php [L,R=301]
我尝试了很多其他方法,但我尝试的任何方法似乎都不起作用。也许是因为我只是不熟悉 apache 重定向以及它如何与 PHP 交互。我擅长 PHP,只是不擅长 apache,因此这可能是我不知道要查找的术语的情况......
任何帮助将不胜感激!
更新
我当前的 apache 配置是:
RewriteEngine On
RewriteRule ^[a-z][a-z]/([a-z/]+.css)$ $1 [L]
RewriteRule ([a-z][a-z])/([a-zA-Z0-9]+) index.php?first=$1&second=$2 [L]
我尝试过切换订单,但这似乎没有任何区别。如果我在 PHP 中检查 $_SERVER['QUERY_STRING'] 变量值,它确实为浏览器中的原始 URL 正确格式化:
Browser: domain.com/ab/0123456789
$_SERVER['QUERY_STRING']: first=ab&second=0123456789
但是,对于页面请求的所有外部文件,这些文件没有被正确重定向,并且 PHP 脚本输出了错误的值:
Browser: domain.com/ab/include/style.css
$_SERVER['QUERY_STRING']: first=ab&second=include
这应该报告为:
$_SERVER['QUERY_STRING']: include/style.css
似乎由于某种原因没有为 css 文件选择第一个 RewriteRule。这也发生在 js 文件中(显然是因为还没有为它们设置规则)。
如果我使用相对路径或硬路径也没有区别......
分辨率
在继续努力使 apache 重定向工作后,我不得不为每个外部源位置添加一个特定的行(不知道为什么“不要恐慌”中的原始 RegEx 语句不起作用)。这是我的 .htaccess 文件现在的样子:
# these are for the external file requests
RewriteRule [a-z][a-z]/images/([a-zA-Z0-9_\.]+)$ /images/$1 [L]
RewriteRule [a-z][a-z]/styles/([a-zA-Z0-9_\.]+)$ /styles/$1 [L]
# these are for the main request for the bootstrap php file
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ([a-z][a-z])/([a-zA-Z0-9]+) index.php?first=$1&second=$2 [L]
还要注意:如果您有任何未在此示例中创建的外部文件(例如 styles/non_existent.css),则上面的最后一个“RewriteRule”将执行并基本上运行 index.php 文件,从而导致您的站点出错.因此,请确保创建(或删除对)外部文件的引用——即使它们是空白的!!!
感谢您对“不要惊慌”的所有帮助!
【问题讨论】:
-
看起来你已经修改了我提供的第一个重写规则,现在它也将匹配你的 CSS,这可能是一个问题。不清楚你为什么修改它,
1234567890不包括大写或小写字母,所以在正则表达式中不需要它们?回复:Browser: domain.com/ab/include/style.css- 这是什么意思?您是在地址栏中输入该值吗?$_SERVER['QUERY_STRING']: first=ab&second=include- 你如何看待$_SERVER对 CSS 文件的请求的值? -
0123456789 只是一个示例值。在现实生活中,值可以是我实现的 a-zA-Z0-9。这只是一个正则表达式匹配。它不匹配 '/' 字符,这意味着它不会匹配子目录,并且是第二条规则,使其成为最后一个要比较的规则。它也与'.'不匹配。字符意味着它不会匹配文件,因为它们将具有包含“.”的文件扩展名。您询问的“浏览器:”请求是浏览器请求的文件。
-
要查看服务器正在请求哪些文件,index.php 文件只是将 $_SERVER['REQUEST_URI'] 和 $_SERVER['QUERY_STRING'] 值输出到文本文件。这样我就可以看到有什么请求进来了。除了原始请求之外的每个额外请求都是通过 HTML 请求的所有外部文件。
-
很难从字里行间了解您正在尝试做什么,以及您实际在做什么,而且它并没有变得更容易:-) 听起来您现在已经修改了 CSS重定向我建议实际由
index.php处理,这样你就可以看到$_SERVER变量?我不确定这样做的目的,但我建议暂时忘记$_SERVER。查看您的浏览器在开发工具中发出的请求。我的答案中的规则在一个干净的 Apache 2 容器中工作,并且与我从您的问题中理解的内容相匹配,尽管我完全理解不正确。