找到并替换所有?和= by / htaccess

时间:2015-07-15 19:07:30

标签: php apache .htaccess

嘿所有我是htaccess的新手,我需要找到并替换所有出现的?和=来自/来自htacess的网址

在我的htaccess文件中,代码是

 ErrorDocument 404 /error404.php
 ErrorDocument 403 /error404.php
 Options -Indexes 
 RewriteEngine On
  RewriteBase /

 RewriteCond %{REQUEST_METHOD} POST [NC]
 RewriteRule ^ - [L]

  RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.*$ [NC] 
 RewriteRule \.(gif|jpg|png)$ http://www.domain.com [L]
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

  RewriteCond %{THE_REQUEST} \s/+page\.php\?id=([^\s&]+) [NC]
  RewriteRule ^ /%1? [R=301,L]


   RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
   RewriteRule ^ /%1 [R=302,L,NE]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
    RewriteRule ^(.+?)/?$ /$1.php [L]

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d

  RewriteRule ^(.+)$ /page.php?id=$1 [L,QSA]

网站上有一些网页,例如page2.php?id = 34 目前它显示像page2?id = 34但我希望它像page2 / id / 34和所有其他页面相同

2 个答案:

答案 0 :(得分:1)

你几乎已经拥有了htaccess所需的一切。您将除了不存在的文件和目录之外的所有内容都指向page.php

然后在你的PHP中,你将/page.php/id/2之类的网址重写为你想要的。

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d

  RewriteRule . /page.php$1 [L,QSA]

然后你需要像许多人一样在page.php或index.php中用PHP解析这些url。

<?php
  $request  = str_replace("/page.php", "", $_SERVER['REQUEST_URI']);
  $params     = split("/", $request);
?>

在此处进一步阅读有关漂亮网址的想法:http://forum.codecall.net/topic/74170-clean-urls-with-php/http://code.tutsplus.com/tutorials/using-htaccess-files-for-pretty-urls--net-6049

答案 1 :(得分:1)

你可以:

ErrorDocument 404 /error404.php
ErrorDocument 403 /error404.php
Options -Indexes 
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_METHOD} POST [NC]
RewriteRule ^ - [L]

RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ http://www.domain.com [L]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{THE_REQUEST} \s/+page\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]

RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

### rules to convert ?n1=v1&n2=v2 /n1/v1/n2/v2 

RewriteCond %{THE_REQUEST} /page2\.php\? [NC]
RewriteCond %{QUERY_STRING} ^([^&]+)&(.*)$
RewriteRule ^ %{REQUEST_URI}?%1/%2 [DPI,E=QS:1]

RewriteCond %{ENV:REDIRECT_QS} =1
RewriteCond %{QUERY_STRING} ^([^=]+)=(.*)$
RewriteRule ^ %{REQUEST_URI}?%1/%2 [DPI,E=QS:1]

RewriteCond %{ENV:REDIRECT_QS} =1
RewriteCond %{QUERY_STRING} ^[^&=]+$
RewriteRule ^(page2)\.php$ /$1/%{QUERY_STRING}? [L,NE,R=302]

# recursion rule to replace /n1/v1/n2/v2 to QUERY_STRING
RewriteRule ^(page2)(?:\.php)?/([^/]+)/([^/]*)(/.*)?$ /$1.php$4?$2=$3 [L,QSA]

### end of convert ?n1=v1&n2=v2 /n1/v1/n2/v2

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f [NC]
RewriteRule ^(.+?)/?$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.+)$ /page.php?id=$1 [L,QSA]