.htaccess 为子文件夹中的 PHP 页面重写漂亮的 URL?

Posted

技术标签:

【中文标题】.htaccess 为子文件夹中的 PHP 页面重写漂亮的 URL?【英文标题】:.htaccess Pretty URL rewrite for PHP pages in a subfolder? 【发布时间】:2012-03-04 23:38:00 【问题描述】:

我有以下目录设置:

http://www.mysite.com/public/

我正在使用以下重写从可见 URL 中删除“公共”文件夹:

#rewrite the URL to display the subdirectory as the main directory for all links
RewriteCond %HTTP_HOST ^(www\.)?mysite\.com
RewriteCond %REQUEST_URI !^/public
Rewriterule ^(.*)$ /public/$1 [L]

这很好用,并且可以正确重定向所有内容。但是,我也想重写一些位于“public”子文件夹中的动态页面,但是我发现任何重写都无法与上述规则结合使用。

例如,使用上面的子目录重写规则,转到如下 URL:

http://www.mysite.com/item.php?id=1&name=item_name

...应该改写为:

http://www.mysite.com/items/item_name

想法?

【问题讨论】:

【参考方案1】:
Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

#rewrite the URL to display the subdirectory as the main directory for all links
RewriteCond %HTTP_HOST ^(www\.)?mysite\.com$ [NC]
Rewriterule ^(?!public/|prints/)(.*)$ /public/$1 [L,NC]

RewriteCond %THE_REQUEST /*item\.php\?id=([^&]*)&name=([^&]*)\s [NC]
Rewriterule ^ /prints/%1/%2? [R,L,NC]

Rewriterule ^prints/([^/]*)/([^/]*)/?$ public/item.php?id=$1&name=$2 [L,NC,QSA]

PS:请确保您的静态包括如 css、js、图像等具有绝对路径而不是相对路径。

【讨论】:

该语法似乎很接近,但与原始规则一起,它仍然没有重写 URL。它仍然以完整的http://www.mysite.com/item.php?id=1&name=item_name 格式出现。我需要在子文件夹“public”中放置一个单独的 .htaccess 文件吗? 不应该都在同一个 .htaccess 文件中。你现在可以试试我编辑的代码吗? 啊,我忽略了另一个事实,请再检查一遍。 还是不行。我仍然需要将子文件夹到根重写规则的原始 3 行与实际的 PHP URL 重写一起工作...... 嗯这次我已经测试好了。看起来其他一些相互冲突的规则正在产生问题。您可以在此处发布 access.log 或 error.log 匹配条目吗?

以上是关于.htaccess 为子文件夹中的 PHP 页面重写漂亮的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 不重定向到 404.php 而是显示页面名称

PHP .htaccess重定向

.htaccess - 将所有 URL + 现有目录重定向到 index.php

使用 .htaccess 从旧页面重定向到新页面

简单的htaccess base重写为子文件夹中的站点,链接与相对路径

htaccess 将除一页之外的所有页面从 html 重定向到 php