繁体   English   中英

.htaccess - 如何将 URL 重定向到文件夹,然后重定向到 PHP 文件

[英].htaccess - How to redirect URL to a folder and then to a PHP file

我正在为我的博客(不是 WordPress)设置缓存系统,并且我想将缓存的文件存储在posts/文件夹中,因此我不会用帖子文件填充我的根文件夹。

我有一个名为post.php文件,如果 slug 对应于不同网站中的实际帖子,它会创建这些帖子文件(我使用 WordPress REST API 进行了检查)。 因此,当我访问mywebsite.com/slug-to-post并且此 URL 与我在根级别上的任何文件都不匹配时,它post.php使用.htaccess FallbackResource post.php ,而post.php使用此slug 创建缓存版本并存储它,但由于可能有数千个帖子,我不希望将文件存储在根级别,而是在posts/name-of-the-file

因此可以通过mywebsite.com/posts/slug-to-post访问该文件,但出于 SEO 的目的,我仍然希望它是mywebsite.com/slug-to-post 我应该在我的 .htaccess 中写入什么以将任何未知文件回post.php posts/文件夹,如果该文件不存在,则再次回post.php存储在根级别的post.php

到目前为止,我尝试过的一切都没有奏效。 要缓存文件,我使用这里的代码: https : //phppot.com/php/php-cache-for-dynamic-web-pages/

更新:这是我当前的.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/posts/$1 -f
RewriteRule ^([^/]+\.php)$ /posts/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^/]+\.php$ post.php [L]

您正在请求格式为/<post-slug> ,它可以:

  1. 映射到文档根目录中形式为/<post-slug>.php的文件。

  2. 或者,映射到此文件的缓存版本,格式为/posts/<post-slug>.php

  3. 否则,请求应该回/post.php文档根目录中的/post.php

除了您的FallbackResource指令外,请尝试以下操作(使用 mod_rewrite):

# Disable MultiViews
Options -MultiViews

RewriteEngine On

# 1. Check for file in the document root
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/.]+)$ /$1.php [L]

# 2. Check for cached version in the "/posts" subdirectory
RewriteCond %{DOCUMENT_ROOT}/posts/$1.php -f
RewriteRule ^([^/.]+)$ /posts/$1.php [L]

# 3. Request does not map to a file, so fallback to "/post.php"
FallbackResource /post.php

这确实假设您的<post-slug>不包含点 ( . )。 这使得在将请求重写为<post-slug>.php更容易避免与静态资源的冲突或创建不必要的文件系统检查。 如果<post-slug>可以包含点,那么我们需要改变RewriteRule模式并添加一个额外的条件

注意:需要禁用 MultiViews 才能正常工作(它可能已经在您的服务器上被禁用)。


 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\\.php -f RewriteRule ^(.*)$ $1.php [NC,L]

只需对原始规则块做一些说明。

  • 如果您使RewriteRule模式更具限制性,而不是匹配任何内容(即 . .* ),那么您可能可以避免检查请求未映射到文件系统目录的条件。 (对文件系统目录的请求是否是有效的请求?)

  • RewriteCond TestString (第一个参数)中的文字点不需要反斜杠转义。 这是一个“普通”字符串,而不是正则表达式。

  • 请注意, %{REQUEST_FILENAME}.php不一定与(可能)重写的 URL $1.php - 它取决于请求和文件系统(因为REQUEST_FILENAME请求映射到文件系统计算的),但是由于您允许任何内容(即 . .* ),因此这里可能会出错。

  • NC标志是多余的,因为RewriteRule模式无论如何都不区分大小写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM