Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
具有多个页面和不同mod_的php网站从同一脚本重写干净的URL_Php_Apache_Mod Rewrite_Redirect - Fatal编程技术网

具有多个页面和不同mod_的php网站从同一脚本重写干净的URL

具有多个页面和不同mod_的php网站从同一脚本重写干净的URL,php,apache,mod-rewrite,redirect,Php,Apache,Mod Rewrite,Redirect,您好,对不起,如果这已经被回答了,我已经搜索了好几天,没有找到答案,也不知道这是不是一个好主意 我正在用PHP脚本创建一个可以返回不同页面的站点。我现在还使用mod_rewrite来创建干净的URL。例如,我有一个脚本myscript.php,根据一些参数,它将返回page1、page2或page3。这很有效 url总是mysite.com/myscript.php,但输出是3个不同的页面 然后我应用mod_rewrite,url现在是mysite.com/publicname。很好,但现在的问

您好,对不起,如果这已经被回答了,我已经搜索了好几天,没有找到答案,也不知道这是不是一个好主意

我正在用PHP脚本创建一个可以返回不同页面的站点。我现在还使用mod_rewrite来创建干净的URL。例如,我有一个脚本myscript.php,根据一些参数,它将返回page1page2page3。这很有效

url总是mysite.com/myscript.php,但输出是3个不同的页面

然后我应用mod_rewrite,url现在是mysite.com/publicname。很好,但现在的问题是我希望这三个不同的页面显示为mysite.com/publicname1mysite.com/publicname2mysite.com/publicname3

既然这需要推?浏览器的不同URL我必须使用重定向到此名称的其他脚本?有没有更好的方法或最佳实践来做到这一点?这有哪些浏览器和设备支持问题?我应该以不同的方式设计我的站点,不做任何重定向,还是PHP Location:redirects在构建站点时得到了很好的支持


谢谢你的帮助

听起来您正试图用一个前端控制器实现路由。这在MVC设计模式中最常见

有很多MVC框架可以做到这一点——CodeIgniter或Yii将是一个良好的开端


如果您确实想自己动手,请查找有关实现前端控制器模式的文章,例如:

浏览器与URL重写无关,他们看不到,也不关心服务器中发生的事情,他们所知道(也应该知道)的是,当他们请求URL(带参数或不带参数)时,他们会得到响应(html、JS、CSS、图像等)

因此,要么你的3个URL(mysite.com/publicname1,mysite.com/publicname2,mysite.com/publicname3)指向同一个文件,要么不同的文件是你的设计,这就是负责这一点的apache http mod_rewrite

因此,如果希望3 url重定向到同一个文件,可以执行以下操作:

RewriteRule ^publicname1$ myscript.php?page=1 [L]
RewriteRule ^publicname2$ myscript.php?page=2 [L]
RewriteRule ^publicname3$ myscript.php?page=3 [L]
或者更简单地说:

RewriteRule ^publicname([0-9]+)$ myscript.php?page=$1 [L]

但这实际上取决于您试图做什么

您问什么还不太清楚:您可以创建重写规则,将任意请求的url“映射”到您的脚本
myscript.php
,并附加一个参数,允许您返回请求url指示的页面。但您不必“推送”url某处。如果您询问链接(html锚)您将其嵌入到某个页面中,以便用户可以单击它们,然后您只需使用硬编码的html页面或回显url的脚本发送它们。不需要任何魔法。抱歉,不清楚。我的意思是,用户在某个页面上,向mysite.com/page提交表单,根据输入内容,他们会返回一个页面,但url也会更改为mysite/page1或mysite/page2。为了更改url,它必须有一个重定向?如果仅此而已,那么您只需要一个重定向规则来发送“外部重定向”(
R=301
)。对,所以用户将表单提交到/page,这会将mod_重写到/myscript.php。根据输入,myscript.php返回重定向到/page1、/page2或/page3,然后mod_重写会再次将这些请求定向到相应的脚本。这是最佳做法吗?当然,这是常见做法。也许你甚至可以限制自己通过重写规则来发送第一个重定向头。第二次重写很可能是在内部进行的,因此你可以在内部将请求重写为自己喜欢的脚本。嗨,Blowski,我没有前端控制器的术语。是的,我们想推出我们自己的,我们的网站将是非常定制的,我们已经调查了很多框架。我仍在试图了解我是否可以从同一个URL请求返回多个不同的URL。用户提交表单到/page并返回/page1或/page2我是否需要重定向以完成是吗?如果你想将URL路由到特定的操作并向用户呈现不同的内容,那么MVC真的会帮助你。然而,正确的操作非常复杂,而且肯定不能用StackOverflow的答案来解释。我很感激,我只想知道如何/是否可以“推送”返回给用户的URL与他们以这种方式请求的URL不同。标题重定向是唯一的答案吗?这样做是否可以/最佳做法?这取决于“推送”的含义。您可以根据URL参数返回不同的内容。在伪代码中,可能类似于
返回呈现发布($\u GET['post\u id'))
。您可以使用mod_rewrite来屏蔽GET变量,也可以使用任何东西作为GET变量。但是,通过执行任何复杂的路由操作,您实际上是在重新发明轮子。