最有用的答案和我正在建模后的实现如下:
我猜测meder给出的答案是你正在寻找的那个,但从技术上讲,你可以创建一个静态映射文件来将一组标题字符串重定向到id,它不必执行外部prg可执行文件:
RewriteMap static-title-to-id txt:/tmp/title_to_id.txt RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
/tmp/title_to_id.txt文件的内容如下:
how-do-I-lose-10kg-in-12-weeks 999 some-other-title 988 and-another 983
足够好的背景。我的.htaccess文件目前包含以下内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
它是典型的wordpress永久链接定制。但是,当我尝试添加类似于上面选定答案中提供的规则时,我收到内部服务器错误。
当我收到内部服务器错误时,这是我的.htaccess文件:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteMap static-title-to-id txt:/tmp/title_to_id.txt
RewriteRule ^/health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
</IfModule>
我希望我的问题很简单,比如规则冲突。如果你能看到错误或者可以在这里提供一些方向,那将非常感激。
答案 0 :(得分:1)
您的代码中有四个错误:
RewriteMap
direction只能在server configuration or virtual host context中使用。
在.htaccess文件中使用mod_rewrite时,mod_rewrites首先从URL路径中删除每个目录前缀,然后再测试规则并在应用规则后重新添加。如果.htaccess位于根目录中,则路径前缀将被删除/
。因此,您需要指定不带前缀的路径模式:
RewriteRule ^health-and-fitness-tips/(.*)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
您的规则的替换也将与该规则相匹配。这将导致无限循环。因此,您需要更改模式或替换以避免这种情况。在您的情况下,更改模式会更好,例如:
RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
您还应指定网址路径的结尾:
RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/ [L]
由于我假设这些URL无法直接映射到现有文件或目录,因此您的第一条规则将在重写之前捕获它们。因此,您应该更改该规则的顺序,以便在catch-all之前应用特定规则:
RewriteRule ^health-and-fitness-tips/([a-zA-Z]+[a-zA-Z0-9]+|[a-zA-Z0-9]+[a-zA-Z]+)/$ /health-and-fitness-tips/${static-title-to-id:$1}/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]