使用 htaccess 重写条件请求

rewriteCond request with htaccess

我想完成以下任务(重写而不是重定向):

  1. searchPage.php?crs_category=variable 喜欢 searchPage.php?crs_category=businesscategory/businesscategory/business/ 不区分大小写

也可以直接访问category/name,是searchPage

的重写
  1. index.php/namepage/name 不区分大小写。请注意,这是重写而不是重定向,我想使用干净的 url.
  2. 访问 index.php/name

也可以直接访问page/name,这是index.php/name

的重写

注意: - 它需要考虑 spaces 例如如果用户点击 searchPage.php?crs_category=html%20and%css 它会将 url 重写为 category/html and css

尝试过:

RewriteEngine On
RewriteBase /

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


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


RewriteCond %{THE_REQUEST} /index\.php/(\S+) [NC]
RewriteRule ^ /page/%1 [NE,R,L]
RewriteRule ^page/([^/]+)/?$ index.php/ [NC,L]

问题: 由于某种原因,该请求不适用于这些行:

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

另外,我不清楚谁兼顾了小白space。如果它的 searchPage.php?crs_category=html%20andcss 它导致 category/html 和 css 而忽略间距代码

更新:

Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^([^\s%20]*)[\s%20]+(.*)$ - [E=NOSPACE:1]

# when there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteRule ^([^\s%20]+)$  [R=301,L]

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

RewriteCond %{THE_REQUEST} /index\.php/(\S+) [NC]
RewriteRule ^ page/%1 [NE,R,L]

RewriteRule ^category/([^/]+)/?$ searchPage.php?crs_category= [QSA,L,NC]

RewriteRule ^page/([^/]+)/?$ index.php/ [NC,L]

您应该在 index.php 之后匹配 / 而不是 ?:

您可以使用这些规则:

RewriteEngine On
RewriteBase /

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

RewriteCond %{THE_REQUEST} /index\.php/(\S+) [NC]
RewriteRule ^ page/%1 [NE,R,L]

# keep replacing space to hyphen until there is no space use internal rewrite
RewriteRule ^(\S*)\s+(.*)$ - [E=NOSPACE:1,DPI]

# when there is no space make an external redirection
RewriteCond %{ENV:NOSPACE} =1
RewriteRule ^(\S+)$  [NE,R=302,L]

RewriteRule ^category/([^/]+)/?$ searchPage.php?crs_category= [QSA,L,NC]

RewriteRule ^page/([^/]+)/?$ index.php/ [NC,L]