使用htaccess重定向GET请求

3
以下是我的htaccess文件内容:
Options -Multiviews -Indexes
RewriteEngine on
RewriteBase /

## don't touch /Forum URIs
RewriteRule ^Forum/ - [L,NC]

## hide .php extension snippet

# To externally redirect /dir/foo.php?id=123 to /dir/foo
RewriteCond %{THE_REQUEST} ^GET\s([^.]+)\.php\?seo=([^&\s]+) [NC] 
RewriteRule ^ %1/%2? [R,L]

# To internally forward /dir/foo/12 to /dir/foo.php?id=12
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/([^/]+)/?$ $1.php?seo=$2 [L,QSA] 

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

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*?)/?$ $1.php [L]

上述代码运行良好,但存在以下两种情况:
  1. 'Forum'目录下的页面未去除'.php'扩展名。这些页面中没有GET请求。如果我删除上面的Forum条件,会显示404错误Forum/.php未找到。

  2. 另外,对于GET请求变量不为'seo'的页面,.php扩展名也未被删除。

  3. 带有' seo '作为GET变量的URL正在转换为SEO友好形式,但带有其他变量(如'id'或'rg=&vp=&da=')的GET请求未能正常工作。我已添加了额外的规则(与seo相同),但仍然没有影响。

请给出建议。

  1. 论坛是一个文件夹,该文件夹下的任何 .php 文件都不会删除 .php 扩展名。
  2. 我只有在根目录中有 .htaccess 文件。
  3. 我有一个页面,其中 GET 请求基于 'seo'、'popular' 和 'rg=&vp=&da='。问题是只有一个这样的条件起作用。其他条件的代码不起作用。例如,http://example.com/test/page.php?seo=abc-def 可以像 http://example.com/test/page/abc-def 一样正常工作,但其他条件如 http://example.com/test/page.php?popular=efg-hik-abc 不会像 http://example.com/test/page/efg-hik-abc 那样显示,其他 "rg=&vp=&da=" 也是如此。
- Puneet
你的代码中,/abc 加载了 /page.php?seo=abc,因此你不能/xyz 加载 /page.php?popular=abc。更好的做法是将每个查询字符串转换为斜杠,例如:example.com/test/page/seo/abc-def/example.com/test/page/popular/xyz/ 等美观的 URL 方案。 - anubhava
对于 forum .php 的问题,如果您需要,我可以发布一个答案。 - anubhava
Anubhav,这将是一个很大的帮助。我可以分享确切的网站,在那里您可以查看上述3个问题,并可能提供解决方案。我刚刚通过Linkedin发送了确切的网站地址。期待您的帮助解决这些问题。敬礼, - Puneet
通过领英发送详细信息 - Puneet
显示剩余2条评论
1个回答

1
将您的 .htaccess 文件设置为以下内容:
Options -Multiviews -Indexes
RewriteEngine on
RewriteBase /

## hide .php extension snippet

# To externally redirect /dir/foo.php?id=123 to /dir/foo
RewriteCond %{THE_REQUEST} \s(.+?)\.php\?seo=([^&\s]+)(?:&(\S+))? [NC] 
RewriteRule ^ %1/%2?%3 [R,L]

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} \s(.+?)\.php(\S*) [NC]
RewriteRule ^ %1%2 [R,L]

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

# To internally forward /dir/foo/12 to /dir/foo.php?id=12
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/]+)/([^/]+)/?$ $1.php?seo=$2 [L,QSA] 

这将导致“论坛”目录下的所有页面都出现404错误,例如example.com/Forum/.php未找到。 - Puneet
现在出现更多错误:所请求的URL /Forum.php在服务器上未找到。此外,其他一些URL也会抛出404错误。 - Puneet
哪个论坛的URL没有起作用?这个.htaccess文件还在DocumentRoot目录下吗?是的,我收到了你的LinkedIn消息。 - anubhava
我只有一个htaccess文件,而且它只在根目录中。此外,我已经在消息中共享了确切的链接和文件夹名称。 - Puneet
Anubhav...论坛是一个例子...正如所述,确切的文件夹名称是“酒店”。 - Puneet
显示剩余15条评论

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