.htaccess mod_rewrite无法删除页面名称

时间:2013-01-28 18:28:59

标签: .htaccess

无法确定.htaccess的mod重写我希望将动态网址的http://www.example.com/archive.php?title=about_me重写为http://www.example.com/about_me。我正在使用php,这是我当前的.htaccess代码,但它只会重写为http://www.example.com/archive/about_me,希望删除存档。

Options +FollowSymLinks -MultiViews
rewriteengine on

RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/archive\.php\?title=([^&\ ]+)
RewriteRule ^ /archive/%1? [L,R=301]
RewriteRule ^/?archive/(.*)$ /archive?title=$1 [L]

## Hide .php extension
## To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

我确实用这段代码正确地重写了

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/archive\.php\?title=([^&\ ]+)
RewriteRule ^ /%1? [L,R=301]
RewriteRule ^/(.*)$ /archive?title=$1 [L]

然而它返回一个页面无法找到错误

2 个答案:

答案 0 :(得分:1)

我希望删除/archive/,您必须确保任何形式为/something 的URI必须绝对路由到archive.php < / strong>脚本。因为根本无法确定/my_blog是否实际上是/my_blog的请求,或者是否需要将其发送到archive.php脚本并将“my_blog”作为标题的值在查询字符串中。您可以做的最好的事情是通过-f-d条件检查它不是对现有资源的请求:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/archive\.php\?title=([^&\ ]+)
RewriteRule ^ /%1? [L,R=301]
# no /archive/ ^

# condition checks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)$ /archive?title=$1 [L]

答案 1 :(得分:0)

这样的事情可以解决问题:

RewriteCond %{QUERY_STRING} ^title=(.*)
RewriteRule ^archive.php /%1?
RewriteRule ^(.*)$ /archive?title=$1 [L]

编辑:添加了最终的RewriteRule,如我对原始问题的评论中所述。根据评论我相信你正在尝试做以下两件事:

  1. 将用户输入的“真实”网址重定向至“友好”网址:http://www.example.com/archive.php?title=about_mehttp://www.example.com/about_me,如问题中所述。

  2. 重写“真实”网址的“友好”网址:http://www.example.com/about_mehttp://www.example.com/archive.php?title=about_me,但未明确说明。

    < / LI>