Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修改重写路径问题_Php_Regex_.htaccess_Mod Rewrite_Lamp - Fatal编程技术网

Php 修改重写路径问题

Php 修改重写路径问题,php,regex,.htaccess,mod-rewrite,lamp,Php,Regex,.htaccess,Mod Rewrite,Lamp,我已经成功创建了重写规则来处理URL,如 以下是mod rewrite®ex: Options +FollowSymlinks RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L] RewriteRule ^/?([-a-zA

我已经成功创建了重写规则来处理URL,如

以下是mod rewrite®ex:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]
这很好,但问题是,当我转到时,我的脚本得到正确的输入(n=abc),但路径混乱,因此代码中的所有相对URL都被破坏,因为它们现在是相对于xyz而不是根的

有办法解决这个问题吗?正如您在上面看到的,我尝试重定向到/index.php以强制路径正确。在漫长的一天的正则表达式和代码之后,我的大脑被炸了,所以我希望这不是一件灾难性的琐事。

编辑:我假设你在谈论HTML代码中的URL,例如图像和样式表,它们都被破坏了

不,据我所知,没有办法绕过它,因为浏览器看到一条路径,并请求与之相关的资源。它与服务器无关,您也无能为力


您必须使用不同的拆分器,该拆分器不解释为目录拆分器(例如下划线),或者使用绝对路径,或者使用。然而,我自己从来没有使用过base标签,无论你在哪里看到它都不是很受欢迎。最好的办法可能是切换到绝对路径。

修改上一个重写规则以包含路径。在正则表达式中有路径

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L]
或者(取决于您试图实现的目标):

使用HTML元素强制所有相对URL使用与浏览器显示的路径不同的路径

<base href="http://www.example.com/"/>
...
<a href="relative/url">link</a>

...
相对URL将使用“”作为其基础,即使浏览器认为它正在查看页面“”。因此链接转到“”而不是“”


还有一种方法是堆栈溢出,即每个URL要么是绝对路径(指向图像等资源),要么是包含根的路径(即“/feeds/questions/123”),这样可以避免相对路径问题。

我尝试在页面中使用BASE元素作为快捷方式,而不是更改所有URL。添加基本元素,如下所示:

<base href="/">

结果如下:

This:    <link type="text/css" rel="stylesheet" href="my.css">
Becomes: <link type="text/css" rel="stylesheet" href="/my.css">

This:    <script type="text/javascript" language="javascript" src="include/my.js"></script>
Becomes: <script type="text/javascript" language="javascript" src="/include/my.js"></script>

This:    <a href="foo.html">
Becomes: <a href="/foo.html">

This:    <a href="foo/bar.html">
Becomes: <a href="/foo/bar.html">
这是:
变成:
这:
变成:
这:
变成:
这:
变成:
如有必要,您始终可以覆盖基本标记:

This:    <a href="/foo">
Remains: <a href="/foo">

This:    <a href="/foo/bar/">
Remains: <a href="/foo/bar/">
这是:
仍然:
这:
仍然:
这三个选项是:

1) 使用基本标记(这将影响页面上的每个相对URI,包括链接、图像、脚本、样式表等)


2) 将所有链接更改为完全限定的URI

<a href="http://yoursite/yourpage.html">

3) 使用“/”前缀显示路径相对于每个URI上的根

<a href="/yourpage.html">


我个人使用的基本标签选项最多,这确实会引起一些负面影响(来自那些没有真正理解它的人)。当谈到mod_rewrite时,基本标记非常完美,因为您可能确实希望所有路径都与根相关,包括所有图像、css、脚本和链接。

这与我想要的正好相反-它需要使用根。感谢您的输入。。。我有点希望能有办法解决这个问题。请让我知道您是否有阅读资料明确指出这一点,我将接受这个答案。请注意,更改基本URI将影响每个相对URI,而不仅仅是那些以URI路径开头的URI。@Antony:我很确定,如果您继续使用斜杠,您将无法绕开它-路径就是路径。您是否考虑过在虚拟路径中使用不同的字符?这看起来不太好,但很管用。我见过使用逗号,在我看来,它看起来很不错,尽管它并不完全合法。@pekka不幸的是,由于项目要求,我需要使用这个URL结构,但我同意使用不同的分隔符更合适。@Pekka Gaiser:使用其他字符而不是段分隔符
/
对URL有完全不同的含义,因为段通常表示层次结构。请注意,更改基本URI将影响每个相对URI,而不仅仅是以URI开头的相对URI请注意,更改基本URI将影响每个相对URI,而不仅仅是以URI路径开头的URI。您和Welbog都有很好的答案。作为失败者的智者,给你一个被接受的分数。谢谢
<a href="http://yoursite/yourpage.html">
<a href="/yourpage.html">