1

无法确定 .htaccess 的 mod 重写我想要将http://www.example.com/archive.php?title=about_me动态 url 重写为的 url 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]

但是它然后返回一个页面找不到错误

4

2 回答 2

1

如果您想要/archive/删除 ,则必须确保任何形式为 的 URI 都/something 必须绝对路由到archive.php脚本。因为根本无法判断是否/my_blog实际上是请求/my_blog或是否需要将archive.php“my_blog”作为查询字符串中标题的值发送到脚本。-f您可以做的最好的事情是通过and-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]
于 2013-01-28T19:44:49.707 回答
0

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

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

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

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

  2. 将“友好” URL重写为“真实” URL:http://www.example.com/about_meto http://www.example.com/archive.php?title=about_me,如前所述并不清楚。

于 2013-01-28T19:29:48.510 回答