.htaccess / php url 没有路由重写?

.htaccess / php url rewriting without routing?

所以我已经搜索了一段时间,但找不到任何关于如何在不将所有内容发送到 index.php 或将内容移动到子文件夹中。

基本上我正在制作一个网站,您目前可以访问 urls,例如 movie.php?id=#### / show.php?id=#### .理想情况下,我希望 url 是 movie/#### 或 movie/id/#### (或者我可以用来获取正确名称的行尾)等.

有没有办法在没有单个 index.php 路由器的情况下做到这一点,还是我必须重写我的所有文件才能遵循这种风格?

是的,假设您的 URL 结构遵循相对一致的模式,您绝对可以使用 .htaccess 文件和 mod_rewrite(不需要 index.php 文件,通常称为前端控制器)。

这是一个非常简单的例子:

RewriteEngine On
RewriteBase /

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

RewriteRule ^(.*)/(.*)$ .php?id= [NC,L]

这需要传入 URL,例如 http://example.com/movie/3 and performs a transparent/internal rewrite (so the user doesn't see the URL change) to http://example.com/movie.php?id=3

当然,可以扩展此示例以处理更多参数等,但希望这能让您走上正确的道路。我强烈建议您阅读 mod_rewrite 文档以获取更多详细信息:http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

您可以在 .htaccess 中创建一个重写规则,将电影 urls 路由到 movie.php,如下所示:

movie/123:

RewriteRule ^movie/(\d+)$ movie.php?id= [L]

movie/id/123:

RewriteRule ^movie/id/(\d+)$ movie.php?id= [L]

movie/title-of-movie:

RewriteRule ^movie/(\S+)$ movie.php?slug= [L]

movie/title/title-of-movie:

RewriteRule ^movie/title/(\S+)$ movie.php?slug= [L]

组合movie/123/片名:

RewriteRule ^movie/(\d+)/(\S+)$ movie.php?id=&slug= [L]

编辑:添加了一个完整的 .htaccess 示例,其中包含最多 2 个额外的可选参数,如果 url 不适用于电影,则回退到 index.php。

Options -Indexes
IndexIgnore */*

Options FollowSymLinks
AddDefaultCharset utf-8

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^movie/([^/]+)/?([^/]*)/?([^/]*)$ movie.php?param1=&param2=&param3= [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule . index.php [L]
</IfModule>

^从头匹配
$匹配到最后
? 出现 0 次或 1 次
+ 出现 1 次或多次
* 出现 0 次或多次

如果 url 规则不匹配且文件不存在,那么它会将 url 路由到 index.php,但如果您不这样做,则可以删除最后一部分我不想那样。