无法确定.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]
然而它返回一个页面无法找到错误
答案 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,如我对原始问题的评论中所述。根据评论我相信你正在尝试做以下两件事:
将用户输入的“真实”网址重定向至“友好”网址:http://www.example.com/archive.php?title=about_me
至http://www.example.com/about_me
,如问题中所述。
重写“真实”网址的“友好”网址:http://www.example.com/about_me
至http://www.example.com/archive.php?title=about_me
,但未明确说明。