php - htaccess 如何不重写某些 URL

标签 php apache .htaccess mod-rewrite url-rewriting

各位开发者大家好。

我正在编写一个混合网站,其中包含 index.php、page1.php 等静态页面以及安装在与静态网站相同级别的顶级目录中的 Nibbleblog。

为了在博客中启用 SEO 友好的 URL,我已按照 Nibbleblog 的建议向 htaccess 添加了以下重写规则。

RewriteBase /eurotint/new-euroting/app/ 是我当前的本地开发目录

RewriteBase /eurotint/new-euroting/app/
RewriteRule ^category/([^/]+)/page-([0-9]+)$ blog.php?controller=blog&action=view&category=$1&number=$2 [L]
RewriteRule ^category/([^/]+)/$ blog.php?controller=blog&action=view&category=$1&number=0 [L]
RewriteRule ^tag/([^/]+)/page-([0-9]+)$ blog.php?controller=blog&action=view&tag=$1&number=$2 [L]
RewriteRule ^tag/([^/]+)/$ blog.php?controller=blog&action=view&tag=$1&number=0 [L]
RewriteRule ^page-([0-9]+)$ blog.php?controller=blog&action=view&number=$1 [L]
RewriteRule ^post/([^/]+)/$ blog.php?controller=post&action=view&post=$1 [L]
RewriteRule ^post-([0-9]+)/(.*)$ blog.php?controller=post&action=view&id_post=$1 [L]
RewriteRule ^page/([^/]+)/$ blog.php?controller=page&action=view&page=$1 [L]
RewriteRule ^feed/$ feed.php [L]
RewriteRule ^([^/]+)/$ blog.php?controller=page&action=$1 [L]

现在的问题:

这对于在博客中启用 SEO 友好的 URL 来说工作正常,但是,如果我输入了带有地址的博客文章,即 websiteAddress/eurotint/new-euroting/app/post/welcome-post/

然后每当我在这个或其他博客页面上单击其中一个静态页面地址(索引、page1、page2)时,即类别等。

重写规则将地址重定向到类似于: websiteAddress/eurotint/new-euroting/app/post/welcome-post/index.php

但我不想重写静态地址,即点击主页按钮应该带我到索引页面 websiteAddress/eurotint/new-euroting/app/index.php 而不是 websiteAddress/eurotint/new-euroting/app/post/welcome-post/index.php

对于我不想重定向到博客页面的文件名,我已经尝试了一些 301 重定向,但是它们都不起作用而且老实说。我不是 Apache 重写规则方面的专家。

此外,静态站点的所有图片 url 等也在博客文章/类别中重写,我也想停止,只重写与博客相关的 url .

任何有关如何实现这一目标的帮助将不胜感激,谢谢。

最佳答案

可能最好的处理方式是使用 文件目录 条件 - 但是因为 RewriteCond 只影响下一个 规则,您需要在每个规则之前添加这些条件,或者创建一个跳过规则:

RewriteBase /eurotint/new-euroting/app/

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=10]
RewriteRule ^category/([^/]+)/page-([0-9]+)$ blog.php?controller=blog&action=view&category=$1&number=$2 [L]
RewriteRule ^category/([^/]+)/$ blog.php?controller=blog&action=view&category=$1&number=0 [L]
RewriteRule ^tag/([^/]+)/page-([0-9]+)$ blog.php?controller=blog&action=view&tag=$1&number=$2 [L]
RewriteRule ^tag/([^/]+)/$ blog.php?controller=blog&action=view&tag=$1&number=0 [L]
RewriteRule ^page-([0-9]+)$ blog.php?controller=blog&action=view&number=$1 [L]
RewriteRule ^post/([^/]+)/$ blog.php?controller=post&action=view&post=$1 [L]
RewriteRule ^post-([0-9]+)/(.*)$ blog.php?controller=post&action=view&id_post=$1 [L]
RewriteRule ^page/([^/]+)/$ blog.php?controller=page&action=view&page=$1 [L]
RewriteRule ^feed/$ feed.php [L]
RewriteRule ^([^/]+)/$ blog.php?controller=page&action=$1 [L]

条件 (RewriteCond) 声明如果请求的文件名一个文件一个目录- skip the next 10 rules ,所以它应该跳过你所有的重写规则。

这假设您定义的重写匹配项均未指向实际存在的文件/目录(例如,您实际上并没有名为 feed 的目录)。

关于php - htaccess 如何不重写某些 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772783/

相关文章:

PHP 与 Node REST-API

python - 将 Mod_wsgi 与 Anaconda python 库一起使用

http - 这个重写规则是什么意思?

php - blogger/wordpress/tumlr 如何允许用户屏蔽 url

php - 如何反转 JSON 对象?

php - Laravel 5 在浏览器中拒绝访问 mysql,但在修补程序中则不然

PHP CodeIgniter 404 部署

html - .htaccess 阻止除我的 ip 之外的所有内容

java - 当 Apache 已经可以拥有 JVM 时,为什么还要发明 Tomcat

php - 区分盗链与现场用户