Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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 如何像这样重写URL?_Php_Apache_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

Php 如何像这样重写URL?

Php 如何像这样重写URL?,php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,我将如何重写(我博客中的每一篇帖子): 及(无身份证) 试试这个规则: RewriteEngine on RewriteRule ^[^/]+/(\d+)$ post.php?id=$1 这将在内部将请求的URI路径重写为/这是post/13的标题/post.php?id=13;所以这和你描述的正好相反。但这就是mod_rewrite的工作原理:您只能更改传入的请求,而不能更改传出的响应 现在,如果要省略数字标识,则标题必须是新标识: RewriteRule ^this-is-the-titl

我将如何重写(我博客中的每一篇帖子):

及(无身份证)

试试这个规则:

RewriteEngine on
RewriteRule ^[^/]+/(\d+)$ post.php?id=$1
这将在内部将请求的URI路径重写为
/这是post/13的标题
/post.php?id=13
;所以这和你描述的正好相反。但这就是mod_rewrite的工作原理:您只能更改传入的请求,而不能更改传出的响应

现在,如果要省略数字标识,则标题必须是新标识:

RewriteRule ^this-is-the-title-of-the-post/(13)?$ post.php?id=13
这意味着它必须是独一无二的。否则,标题无法明确映射到数字ID。在这种情况下,如果您将标题传递到post.php,那么标题肯定会更容易:

显然,由于标题是唯一的,因此您不再需要数字标识。

尝试以下规则:

RewriteEngine on
RewriteRule ^[^/]+/(\d+)$ post.php?id=$1
这将在内部将请求的URI路径重写为
/这是post/13的标题
/post.php?id=13
;所以这和你描述的正好相反。但这就是mod_rewrite的工作原理:您只能更改传入的请求,而不能更改传出的响应

现在,如果要省略数字标识,则标题必须是新标识:

RewriteRule ^this-is-the-title-of-the-post/(13)?$ post.php?id=13
这意味着它必须是独一无二的。否则,标题无法明确映射到数字ID。在这种情况下,如果您将标题传递到post.php,那么标题肯定会更容易:


显然,由于标题是唯一的,因此您不再需要数字ID。

mod_rewrite是一个Apache模块,它允许您使用正则表达式执行此操作。如果您使用的是Windows/IIS web服务器,那么您将拥有完全不同的技术;我会坚持使用Apache

您的第一个示例非常简单,因为重写的URL只需要在正确的位置包含ID就可以工作。前面的答案已经给出了一个可行的解决方案

第二个示例(即在重写的URL中没有ID)需要修改基础PHP以查询DB以查找页面标题而不是ID(这可能会影响站点的性能,具体取决于您的编写方式)。或者,您可以为每个单独的URL指定一个特定的重写规则,但这是一个需要维护的开销

mod_rewrite的坏消息是,让它工作起来可能是一门相当黑暗的艺术,特别是如果你对正则表达式不在行的话。问题是,如果它不起作用,您的浏览器中只会出现一个服务器配置错误,并且很难进行调试。如果你愿意持之以恒,那么付出的努力是值得的,但对于初学者来说,这可能会令人沮丧

好消息是,如果您使用的是诸如Wordpress或Drupal之类的CMS产品,这些产品内置了URL重写功能,因此您根本不需要乱动服务器配置


希望对您有所帮助。

mod_rewrite是一个Apache模块,允许您使用正则表达式执行此操作。如果您使用的是Windows/IIS web服务器,那么您将拥有完全不同的技术;我会坚持使用Apache

您的第一个示例非常简单,因为重写的URL只需要在正确的位置包含ID就可以工作。前面的答案已经给出了一个可行的解决方案

第二个示例(即在重写的URL中没有ID)需要修改基础PHP以查询DB以查找页面标题而不是ID(这可能会影响站点的性能,具体取决于您的编写方式)。或者,您可以为每个单独的URL指定一个特定的重写规则,但这是一个需要维护的开销

mod_rewrite的坏消息是,让它工作起来可能是一门相当黑暗的艺术,特别是如果你对正则表达式不在行的话。问题是,如果它不起作用,您的浏览器中只会出现一个服务器配置错误,并且很难进行调试。如果你愿意持之以恒,那么付出的努力是值得的,但对于初学者来说,这可能会令人沮丧

好消息是,如果您使用的是诸如Wordpress或Drupal之类的CMS产品,这些产品内置了URL重写功能,因此您根本不需要乱动服务器配置


希望这会有所帮助。

如果您只想拥有纯文本URL(URL中没有pk引用),则必须在数据库中实现唯一的SLUG字段(对于日期,它可以是唯一的,就像wordpress一样)。

我建议将所有与现有文件不匹配的请求重定向到index.php,并处理$_SERVER['REQUEST_URI'],避免处理mod_rewrite magick(从长远来看会导致无法维护和magick代码)

若您只想拥有纯文本URL(URL中不包含pk引用),则必须在数据库中实现唯一的SLUG字段(对于日期可以是唯一的,就像wordpress一样)。
我建议将所有与现有文件不匹配的请求重定向到index.php,并处理$_SERVER['REQUEST_URI'],避免处理mod_rewrite magick(从长远来看会导致无法维护和magick代码)

RewriteCond %{REQUEST_FILENAEM} !-f
RewriteRule ^([^/]+)/$ post.php?title=$1