使用RewriteCond和%{REQUEST_URI}进行mod_rewrite

时间:2016-08-17 13:58:19

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

我想要网址:

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 个答案:

答案 0 :(得分:3)

-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]

答案 1 :(得分:1)

我想你的意思是

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绝对路径。