使用RewriteCond和%{REQUEST_URI}进行mod_rewrite

3

I would like the URL:

http://domain.com/category/subcategory/title

指向:
http://domain.com/posts/category/subcategory/title.php

我的 .htaccess 文件看起来是这样的:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !^.+
#RewriteCond post/%{REQUEST_URI}.php -f
RewriteRule ^(.*)$ post/$1.php [L]

当我取消注释上面的那一行时,它能够正常工作。

我已经尝试过:

RewriteCond /post/%{REQUEST_URI}.php -f
RewriteCond post/%{REQUEST_URI}.php -f
RewriteCond post%{REQUEST_URI}.php -f

这些都不起作用。我做错了什么?

还有没有一种简单的方法来调试这些规则?比如记录变量或其他内容?

2个回答

6

-f 检查需要完整的文件系统路径。您可以使用 %{DOCUMENT_ROOT} 变量来实现:

RewriteEngine on
RewriteBase /

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

2
我猜您的意思是这一行代码:
RewriteCond post/%{REQUEST_URI}.php -f

REQUEST_URI是请求URI的路径组件,例如"/index.html"。

post/%{REQUEST_URI}.php是从Apache Web服务器运行的某个相对路径。这可能是根目录/、Apache的配置目录/etc/apache2、其文档根目录/var/www/html,甚至是/var/tmp或其他任何位置。

  • /post/%{REQUEST_URI}.php
  • /etc/apache2/post/%{REQUEST_URI}.php
  • /var/www/html/post/%{REQUEST_URI}.php
  • /var/tmp/post/%{REQUEST_URI}.php
  • /home/olaf/post/%{REQUEST_URI}.php

正如您所看到的,您无法确定Apache将查看哪个文件。而且Apache可能会在此处找到文件,也可能不会。为了确保,您必须提供绝对路径,就像@anubhava已经建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接