.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=¶m2=¶m3= [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,但如果您不这样做,则可以删除最后一部分我不想那样。
所以我已经搜索了一段时间,但找不到任何关于如何在不将所有内容发送到 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=¶m2=¶m3= [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,但如果您不这样做,则可以删除最后一部分我不想那样。